R 从矩阵的每一行向函数传递参数

R 从矩阵的每一行向函数传递参数,r,R,我创建了这个函数: nDone<- function (under,strike,ttoe,vol,rf,dy) { return(pnorm(((log(under/strike) + (rf-dy+(vol^2)/2)*ttoe)/(vol*(ttoe^0.5))))) } nDone(90,100,3,0.17,0.05,0) [1] 0.6174643 现在我想把每行中的元素传递给函数。我已尝试使用apply: apply(b,1,nDone) 并获取以下错误: E

我创建了这个函数:

nDone<- function (under,strike,ttoe,vol,rf,dy) {
    return(pnorm(((log(under/strike) + (rf-dy+(vol^2)/2)*ttoe)/(vol*(ttoe^0.5)))))
 }

nDone(90,100,3,0.17,0.05,0)
[1] 0.6174643
现在我想把每行中的元素传递给函数。我已尝试使用apply:

apply(b,1,nDone)
并获取以下错误:

Error in under/strike : 'strike' is missing
Error in under/strike : 'strike' is missing
我也试过:

lapply(b,nDone)
我得到以下错误:

Error in under/strike : 'strike' is missing
Error in under/strike : 'strike' is missing
我想要的是函数的多个结果。我做错了什么?

这应该可以:

apply(b, 1, function(x)do.call(nDone, as.list(x)))

您的版本的错误在于,通过apply,您的nDone函数将整行作为单个参数获取,也就是说,在strike下传递一个向量,而其他参数没有任何结果。解决方案是使用do.call。

值得一提的是,如果您想将函数的结果绑定到原始矩阵,可以使用plyr中的mdply


嗯……这和你的问题完全一样。嗨,乔兰,我知道它看起来是一样的,我当然不会浪费任何人的时间。在这个问题中,我试图将矩阵的每一行传递给一个函数。再次感谢您的审阅。是的@乔兰的回答实际上是对前一个问题的评论,应该也能回答这个问题。他给你留下了一点斗争/解释的余地。我建议你看看他的评论,看看你是否能理解如何处理它,如果你不能回来要求澄清……你可以走的另一条路是这样的:nDone[,1],b[,2],b[,3],b[,4],b[,5],b[,6],因为nDone已经矢量化了。或者将矩阵转换为一个列表,每列作为一个元素,并使用上一个问题的解决方案。
> library(plyr)
> mdply(b, nDone)

  X1  X2 X3   X4   X5 X6        V1
1 90 100  3 0.17 0.05  0 0.6174643
2 95 100  2 0.18 0.05  0 0.6249916