我正在尝试使用
purrr
包组成一组部分应用的函数。我注意到我可以使用某些功能来执行此操作,但不能使用其他功能,我想知道为什么(或者如果可能的话我会错过什么)?
具体来说,我可以使用
rename
、select
和head
(而且我也成功地使用了我定义的自定义函数),但我似乎无法使用select
和filter
。
在下面的代码中,如果我取消注释任何这些行,我会收到类似
object 'milespergallon' not found
的错误。
我尝试引用变量,在其中编写函数,但似乎没有任何效果 - 这里有一般限制吗?
library("purrr")
library("dplyr")
my_func = compose(
partial(rename, "milespergallon" = mpg), # works fine
partial(mutate, new_col = milespergallon + cyl), # works fine
# partial(select, milespergallon, cyl, new_col), # not sure why this one fails?
# partial(filter, cyl > 2), # not sure why this one fails?
# partial(filter, milespergallon > 20), # not sure why this one fails?
head, # works fine
.dir = "forward"
)
my_func(mtcars)
取消注释有问题的行,我得到一个合理的输出:
my_func(mtcars)
milespergallon cyl disp hp drat wt qsec vs am gear carb new_col
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 27.0
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 27.0
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 26.8
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 27.4
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 26.7
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 24.1
如果您查看
?partial
帮助页面,您将看到如何传递未命名参数。这应该有效
my_func = compose(
partial(rename, "milespergallon" = mpg),
partial(mutate, new_col = milespergallon + cyl),
partial(select, ... = ,milespergallon, cyl, new_col),
partial(filter, ... =, cyl > 2),
partial(filter, ... =, milespergallon > 20),one fails?
head,
.dir = "forward"
)
您可以使用
查看它创建的函数partial(select, milespergallon, cyl, new_col)
# <partialised>
# function (...)
# select(milespergallon, cyl, new_col, ...)
注意它是如何传递参数列表末尾的
...
的。如果您像前两个 rename
和 mutate
调用一样使用命名参数,这实际上并不重要,并且数据帧将作为第一个参数传递,因为它是未命名的。比较一下
partial(select, ... = ,milespergallon, cyl, new_col)
# <partialised>
# function (...)
# select(..., milespergallon, cyl, new_col)
现在您会看到
...
将出现在未命名参数之前,因此它将在调用的正确部分传递 data.frame。