r - 如何在 dplyr 中使用 NSE 来引用一个变量?

标签 r dplyr

我想编写一个在 dplyr 链中使用的函数,以按给定变量排列分组数据,然后检查该变量是否严格递增整​​数(例如,1,2,3, ...)。为了澄清,我的意思是按顺序排列的每个整数,而不仅仅是递增的整数。所以 1,2,4,... 应该失败。

这个想法是最终有这样的东西,看起来像这样,并且如果每个组的 x 不是 1,2,3,... 则提供一个错误。

d %>% group_by(group) %>% check(x) 

我已经编写了一个 SE 版本,似乎可以工作,如下所示,但我陷入了 NSE 版本。

check_ <- function(.data, var) {
  checkint <- function(x) { stopifnot(x == seq_along(x)) }
  do(.data, {
    . <- dplyr::arrange_(., var)
    checkint(lazyeval::lazy_eval(var, data=.))
    .
  })
}

在文档中,看起来我应该使用lazy来处理单个变量,但是当我传入的变量也存在于全局环境中时,这不起作用。

checkX <- function(.data, var) {
  check_(.data, lazyeval::lazy(var))
}

d <- expand.grid(group=1:2, x=3:1)
x <- 5 ## put an "x" in the global environment
d %>% group_by(group) %>% checkX(x)

## Error: incorrect size (1), expecting : 3 

我确实有一个似乎可以工作的 NSE 版本,但调用 lazy_dots 感觉不对,因为我只想要一个变量。

check <- function(.data, ...) {
  check_(.data, lazyeval::lazy_dots(...)[[1]])
}

最佳答案

看起来lazyeval已经发生了变化。 latest vignette甚至没有引用lazy()函数。它似乎确实存在范围内变量的问题(更多内容在底部)。现在我们的功能受到了鼓励,尽管它们还没有进入所有的“tidyverse”。

看起来您想要的函数是expr_find。如果我们将 checkX 定义为

checkX <- function(.data, var) {
  check_(.data, lazyeval::expr_find(var))
}

然后就可以了

x <- 5
d %>% group_by(group) %>% checkX(x)

(或者至少对于 lazyeval_0.2.0dplyr_0.5.0 是这样)

但是回到 old vignette 中的第一个示例

library(lazyeval)
# `x` does not exist here
f <- function(x = a - b) {
  lazy(x)
}
f()
# <lazy>
#   expr: a - b
#   env:  <environment: 0x000000000663d618>
exists("x")
# [1] FALSE
f(x)
# <lazy>
#   expr: x
#   env:  <environment: R_GlobalEnv>
x <- 101
f(x)
# <lazy>
#   expr: 101
#   env:  <environment: R_GlobalEnv>

或者另一个更简单的例子

# rm(x)
lazy(x)
# <lazy>
#   expr: x
#   env:  <environment: R_GlobalEnv>
x <- 100
lazy(x)
#  <lazy>
#   expr: 100
#   env:  <environment: R_GlobalEnv>

它在某个地方评估参数 x,因此如果它存在于它来自的环境中,它就永远不会保留在惰性对象中。

关于r - 如何在 dplyr 中使用 NSE 来引用一个变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39779516/

相关文章:

r - 如何使用范围信息获取栅格的像元编号?

r - 在 RMarkdown ioslides {.columns-2} 布局中强制分列

r - 在管链中捕获对象的 "safe state"

r - 如何在 R 中的 NA 之后生成虚拟变量

r - 对 dplyr 中具有相同编号的相同分组值进行编号

r - 如何分析 R 中的不规则时间序列

r - dplyr 编程方式过滤最近一周

r - dplyr ifelse 语句中的嵌套条件

r - 计算 R 中多列的唯一值

使用 dplyr 和 rollapply 在数据框中滚动预测