在 purrr::compose 中与 R 中的 purrr::partial 一起使用时使用 select 和 filter 时出现问题

问题描述 投票:0回答:1

我正在尝试使用

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
r function dplyr functional-programming purrr
1个回答
0
投票

如果您查看

?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。

© www.soinside.com 2019 - 2024. All rights reserved.