【发布时间】:2016-07-17 04:40:03
【问题描述】:
目标
我的目标是定义一些在dplyr 动词中使用的函数,这些函数使用预定义的变量。这是因为我有一些函数需要一堆参数,其中许多总是相同的变量名。
我的理解:这很困难(也许是不可能的),因为dplyr 稍后会延迟评估用户指定的变量,但任何默认参数都不在函数调用中,因此dplyr 不可见。
玩具示例
考虑以下示例,我使用dplyr 来计算变量是否已更改(在这种情况下毫无意义):
library(dplyr)
mtcars %>%
mutate(cyl_change = cyl != lag(cyl))
现在,lag 也支持像这样的交替排序:
mtcars %>%
mutate(cyl_change = cyl != lag(cyl, order_by = gear))
但是,如果我想创建自己的 lag 版本并始终按 gear 排序,该怎么办?
尝试失败
天真的方法是这样的:
lag2 <- function(x, n = 1L, order_by = gear) lag(x, n = n, order_by = order_by)
mtcars %>%
mutate(cyl_change = cyl != lag2(cyl))
但这显然会引发错误:
找不到名为“gear”的对象
更现实的选择是这些,但它们也不起作用:
lag2 <- function(x, n = 1L) lag(x, n = n, order_by = ~gear)
lag2 <- function(x, n = 1L) lag(x, n = n, order_by = get(gear))
lag2 <- function(x, n = 1L) lag(x, n = n, order_by = getAnywhere(gear))
lag2 <- function(x, n = 1L) lag(x, n = n, order_by = lazyeval::lazy(gear))
问题
有没有办法让lag2 在dplyr 正在运行的data.frame 中正确找到gear?
- 应该可以拨打
lag2,而无需提供gear。 - 应该能够在不称为
mtcars的数据集上使用lag2(但确实有gear作为它的变量之一)。 - 最好
gear是函数的默认参数,因此如果需要,它仍然可以更改,但这并不重要。
【问题讨论】:
-
gear是另一个向量,对吗?您没有将其传递给lag2的本地环境。试试lag2 <- function(x, gear) {...}(注意,不需要参数n)。 -
gear是mtcars中的一个变量。是的,我搞砸了n论点。 -
@Axeman 如果你愿意,我可以建议几种方法,几乎可以让你到达你想要的
data.table,但它们都不适用于dplyr -
@eddi 总是乐于学习,但我已经非常致力于 (
multi)dplyr这个特定项目。 -
我从来不明白人们是如何致力于(被困?)在 R 中只使用一个特定的库,该库是专门为使用大量库而设计的。