我正在尝试将嵌套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
可能是什么,它是"猜测"还是在它首先看到的默认值?
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
传递给此函数。相反,如果您将该参数传递为a
lapply(testlist4, function(d){ lapply(testlist5, foo, a=d)})
你会打电话
foo("winter", a="hello")
# [1] "hellowinter"
根据命名和位置参数的工作方式规则,它将把"winter"值放在第二个参数中,因为这是调用中未命名的空隙。可以在 R 语言定义中阅读有关参数匹配的详细信息