apply() 函数中的错误,但 for 循环有效

Posted

技术标签:

【中文标题】apply() 函数中的错误,但 for 循环有效【英文标题】:Error in apply() function, for-loop works though 【发布时间】:2014-04-21 16:23:42 【问题描述】:

我正在尝试使用应用功能。我有一个名为 rowcosty() 的函数:

rowcosty <- function(p,x,y)
    return (-1*y*log(hyp(p,x))-(1-y)*log(1-hyp(p,x)))


hyp <- function(p, input)
    return (sigmoid(p %*% input))


sigmoid <- function(y)
    return (1/(1 + exp(-y)))

在我的示例中,p 是长度为 5000 的向量,x 是维度为 5000 X 400 的矩阵,y 也是长度为 5000 的向量。

现在我想将 rowcosty() 函数应用于 x 中的每一行,然后返回一个长度为 5000 的向量,其中包含 rowcosty() 为每一行返回的值。

我使用 for 循环成功地做到了这一点:

vec <- rep(0,5000)
for(i in 1:5000)
    vec[i] <- rowcosty(p,x[i,],y[i])

但是这个 apply() 函数的调用产生了错误:“Error in -y * log(hyp(p, x)) : non-conformable arrays”

apply(x,1,rowcosty,p = p, y = y)

谁能告诉我这里出了什么问题?

【问题讨论】:

【参考方案1】:

当您执行rowcosty(p,x[i,],y[i]) 时,您同时间接地循环了两个变量:xyapplylapplysapplyvapply 都在单个变量上循环。

mapply 是循环两个或多个变量时的常用方法。你可以这样做:

mapply(rowcosty, split(x, row(x)), y, MoreArgs = list(p = p))

或者您也可以循环单个变量:索引i

sapply(1:nrow(x), function(i) rowcosty(p,x[i,],y[i])) 

【讨论】:

以上是关于apply() 函数中的错误,但 for 循环有效的主要内容,如果未能解决你的问题,请参考以下文章

apply() 函数家族介绍

R语言中的apply函数族

如何用R语言for循环形成112358

为啥 .forEach() 有效但 for 循环无效? [复制]

“*apply”家族真的没有向量化吗?

R用for循环保存图(保存直方图有效)