公式参数 ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width
被传递给purrr :: as_mapper
。
purrr::as_mapper(~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width)
你可以看到这个函数没有直接的方式知道这些变量是什么。
我能想到3种解决办法。我将使用 @zacdav 的例子,因为它比你的更简洁易读:
你可以看到这个函数没有直接的方式知道这些变量是什么。
我能想到3种解决办法。我将使用@zacdav的例子,因为它更加紧凑和易于阅读:
named_list <- list(one = c(1, 1),
two = c(2, 2),
three = c(3, 3))
明确定义
您可以像@zacdav的答案所示那样明确定义这些变量,它将起作用。
探索dots参数
有一种方法可以通过as_mapper
返回的函数的...
参数访问命名参数。
当存在名称时,函数的参数会被命名,如文档所述。
这就解释了为什么pmap(named_list, function(x,y,z) x+y+z)
会失败并显示错误信息:
unused arguments (one = .l[[c(1, i)]], two = .l[[c(2, i)]], three = .l[[c(3, i)]])
请参见:
pmap(named_list, ~names(list(...)))
另一方面,pmap(unname(named_list), function(x,y,z) x+y+z)
将能够正常工作。
因此这会起作用:
pmap(named_list, ~ with(list(...), one + two + three))
使用 pryr::f
pryr
提供了一个与 pryr::f
一起使用的函数定义的简便方式:
library(pryr)
f(one + two + three)
pmap(named_list, f(one + two + three))
然而,在使用它时要小心,全局变量仍将显示为参数,而函数是否包括在参数中则取决于它们的调用方式。例如:
x <- 1
test <- mean
f(test(x) + lapply(iris,test2))
因此,它不是一个通用的方法,您应该只在简单情况下使用它。第二种方法虽然有点巧妙,但会是通用的。
此外,f
按字母顺序排列参数,在处理命名列表时不应该成为问题,但在处理部分命名列表时要小心。
pryr
,所以谢谢。 - geotheory