【发布时间】:2019-01-02 01:30:32
【问题描述】:
假设我有两个向量
a <- c(1,2,3,4,5)
b <- c(6,7,8,9,10)
还有一个函数
calc <- function(x,y){x + y)
我想将这个函数应用于a 中的第一个值,用于b 中的每个值。假设在我的情况下calc 只允许来自a 和b 的单个值作为输入,所以lapply(a,calc,b) 将不起作用,因为长度(b)不是1(给我一个错误)。
另外mapply 也没有给我想要的解决方案,它只将函数应用于配对值,即1+6、2+7 等。
所以我构建了一个函数,它给了我想要的解决方案
myfunc <- function(z){lapply(a,calc,z)}
并将其应用于 b
solution <- lapply(b,myfunc)
我们在这里看到lapply(a,calc,b) 或嵌套lapply(a,lapply,calc,b) 的区别在于它为我提供了自己列表中的所有值。这就是我想要的,或者至少它是一个给我正确结果且没有错误的函数。
现在,有没有更快/更简单的方法,因为我只是在这里做了一点实验。而且我的函数比calc 大得多,需要10分钟,但也许我必须精简我的原始函数,这里不会有更快的方法......
编辑:
在我的函数中有这样的东西,
calc <- function(x,y){
# ...
number <- x
example <- head(number,n=y)
# ...
}
向量作为 y 的输入不再起作用。使用lapply(a,lapply,calc,b) 或lapply(a,calc,b) 时出现错误,
Error in head.default(number, n = y) : length(n) == 1L is not TRUE
【问题讨论】:
-
不返回列表中的结果,但也许你可以使用
outer(a,b,calc)? -
@Florian 需要小心外部,
function需要正确矢量化 -
在@AkselA 的回复下查看我的评论...
-
我很困惑。我们已经知道您的函数只接受标量或单个值作为输入。在评论中,您询问了如何访问值,那是关于什么的?和你提到的线性回归有什么关系吗?
-
好吧,我的函数输出是线性回归的拟合,使用我的解决方案我可以简单地访问它们,但是使用您的解决方案导致矩阵拟合似乎被拆分了。该解决方案应该有 5x5 拟合,因此矩阵中有 25 个元素,但您的矩阵中有 300 个元素......