默认情况下,如何为 R 中的用户定义函数分配参数?



我正在尝试将嵌套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如何确定ab可能是什么,它是"猜测"还是在它首先看到的默认值?

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 语言定义中阅读有关参数匹配的详细信息

相关内容

  • 没有找到相关文章

最新更新