r - 整洁的评估 : Adding an argument to a function that prevents gathering

标签 r tidyr tidyeval

我正在尝试构建一个收集(pivot_longer)数据的函数。
在大多数情况下,该函数应该收集所提供数据中除一列之外的所有列,但是应该允许用户在所提供数据中指定不应收集的其他列。这是用户很少会做的事情,因此参数应该默认为没有额外的列。

我认为我的函数失败是因为它默认为 NULL

数据:

library(tidyverse)
sample_data <- tibble(
  frame = rep(seq(1:20), 2),
  ID = rep(c(1,2), each = 20),
  a = rnorm(n = 40),
  b = rnorm(n = 40),
  c = rnorm(n = 40))

功能:

a_gather_function <- function(.data, also_dont_gather = NULL) {
  .data %>% 
  tidyr::gather(key, value, -frame, -{{also_dont_gather}})
}

如果我为参数 also_dont_gather 提供一列,该函数就会工作

sample_data %>% 
  a_gather_function(also_dont_gather = ID) %>% 
  head(5)

# A tibble: 5 x 4
  frame    ID key    value
  <int> <dbl> <chr>  <dbl>
1     1     1 a     -0.626
2     2     1 a      0.184
3     3     1 a     -0.836
4     4     1 a      1.60 
5     5     1 a      0.330

但默认值 NULL 失败:

sample_data %>% 
  a_gather_function()

 Error in -x : invalid argument to unary operator 

我很确定错误来自评估为 -NULL 的函数,因为以下代码给出了相同的错误:

sample_data %>% 
  tidyr::gather(key, value, -frame, -NULL)

Error in -x : invalid argument to unary operator

你能帮我构建一个函数,允许用户指定不应收集但默认为没有额外列的额外列吗?

最佳答案

编辑:此答案已过时,参见https://stackoverflow.com/a/57900856/1725177对于推荐的解决方案。

我在 tidyselect 中打开了一个问题.

在此期间,您可以使用引号和反引号模式,并检查您是否使用 quo_is_null() 捕获了默认的 NULL:

a_gather_function <- function(.data, also_dont_gather = NULL) {
  also_dont_gather <- enquo(also_dont_gather)

  if (rlang::quo_is_null(also_dont_gather)) {
    tidyr::gather(.data, key, value, -frame)
  } else {
    tidyr::gather(.data, key, value, -frame, -!!also_dont_gather)
  }
}

关于r - 整洁的评估 : Adding an argument to a function that prevents gathering,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57590111/

相关文章:

如果测试数据中存在新的因子水平,R 中的随机森林包会在 prediction() 期间显示错误。有什么办法可以避免这个错误?

r - 如何使用函数 `gather`(或类似函数)重组数据以将四个变量减少为两个

r - 在 R 中合并两个具有 2 列(逗号分隔内容)的数据框

r - dplyr array() 适用于 c() 内的单个变量,但在函数内部求值时不适用于 c() 内的多个变量

R:将带有列表的数据框输出到csv

r - 使用 AV 包合并/连接视频并在 R 中保留声音

r - tidyr::pivot_longer 到多列

r - 通过自定义函数在循环中创建一个新的均值列

r - 不在 dplyr tidyeval 中时抛出错误

r - 通过将两列分组并将其保存到新列中来应用函数