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

时间:2019-12-03 14:27:52

标签: r lapply

我正在尝试将嵌套的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可能是什么,是“猜测”还是在默认情况下优先出现?

1 个答案:

答案 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"

这是因为内部lapplytestlist5上进行迭代,因此默认情况下这些值将优先出现。您还将d的值作为命名参数b传递给此函数。相反,如果您像{p1

a

您会打电话给

lapply(testlist4, function(d){ lapply(testlist5, foo, a=d)})

根据命名参数和位置参数的工作规则,会将“ winter”值放在第二个参数中,因为这是在调用中未命名的插槽打开时间。您可以阅读有关argument matching in the R language definition

的更多信息