我正在尝试将嵌套的for loops
转换为纯lapply
调用,因为到目前为止,我一直在使用两者的混合。我很难理解如何在lapply
中定义要循环的元素。为了获得基本的了解,当我尝试模仿此处建议的嵌套lapply
时,我使用了非常简单的代码:https://stackoverflow.com/a/43293798
testlist4 <- c("hello", "goodbye", "again")
testlist5 <- c("winter", "summer")
lapply(testlist4, function(d){ lapply(testlist5, function(a,b) {paste0(a, b)}, b=d)})
[[1]]
[[1]][[1]]
[1] "winterhello"
[[1]][[2]]
[1] "summerhello"
[[2]]
[[2]][[1]]
[1] "wintergoodbye"
[[2]][[2]]
[1] "summergoodbye"
[[3]]
[[3]][[1]]
[1] "winteragain"
[[3]][[2]]
[1] "summeragain"
我知道d
是我为外部lapply
调用定义的,并且我假设它在顶级列表元素上进行迭代。但是R如何确定a
和b
可能是什么,是“猜测”还是在默认情况下优先出现?
答案 0 :(得分:1)
lapply
会将值传递给您指定为函数的第一位置的未命名参数。所以如果我在您的样本中提取函数
foo <- function(a,b) {paste0(a, b)}
lapply(testlist4, function(d){ lapply(testlist5, foo, b=d)})
第一次调用foo()
时将使用
foo("winter", b="hello")
# [1] "winterhello"
这是因为内部lapply
在testlist5
上进行迭代,因此默认情况下这些值将优先出现。您还将d
的值作为命名参数b
传递给此函数。相反,如果您像{p1
a
您会打电话给
lapply(testlist4, function(d){ lapply(testlist5, foo, a=d)})
根据命名参数和位置参数的工作规则,会将“ winter”值放在第二个参数中,因为这是在调用中未命名的插槽打开时间。您可以阅读有关argument matching in the R language definition
的更多信息