我在网上可以找到的有关提迪耶瓦尔的所有信息都是较旧的并且不是最新版本的tidyverse \ dplyr的最新版本,否则可能并不适用。
一个小例子是:
df <- tribble(
~var1, ~var2, ~var3,
1, 2, 3,
4, 5, 6,
7, 8, 9
)
我写了一个小函数:
fun <- function(data, select_var, arrange_var) {
select_var <- enquo(select_var)
arrange_var <- enquo(arrange_var)
data %>%
select(!!select_var) %>%
arrange(!!arrange_var)
}
该函数仅选择列,然后按行排列。
当我将参数传递给函数时,它可以在c()内部使用单个变量正常工作:
fun(df,
c(var1,
var2)),
c(var2))
但是,当我尝试传递两个变量时,如下所示:
fun(df,
c(var1,
var2)),
c(var1,
var2))
我收到以下错误:
Error: incorrect size (282) at position 1, expecting : 141
我能够找到的最接近的堆栈响应是: arrange() doesn't recognize column name parameter 和 Pass a vector of variable names to arrange() in dplyr
但是这两个方法似乎都给出了包含过时解决方案的答案(例如,ranging _())
一些重要信息: tidyeval resource roundup,作者Mara Averick
和 Separating and Trimming Messy Data the Tidy Way,作者Paul Oldham
当然,我已经研究过:tidyeval
但是他们似乎都没有解决这个怪癖。度过一个下午后,我已经用光了资源。该代码可以在标准R文件中找到,只是无法使其在函数内部工作,但是快要放弃了,所以我想我想看看您的好伙伴是否可以提供帮助。预先感谢。
答案 0 :(得分:3)
用arrange_var
代替...
并指定变量而不将其括在c()
中即可。
library("dplyr")
df <- tribble(
~var1, ~var2, ~var3,
1, 2, 3,
4, 5, 6,
7, 8, 9
)
fun <- function(data, select_var, ...) {
select_var <- enquo(select_var)
data %>%
select(!!select_var) %>%
# You can pass the dots to `arrange` directly
arrange(...)
}
fun(df, c(var1, var2), var2)
#> # A tibble: 3 x 2
#> var1 var2
#> <dbl> <dbl>
#> 1 1 2
#> 2 4 5
#> 3 7 8
fun(df, c(var1, var2), var1, var2)
#> # A tibble: 3 x 2
#> var1 var2
#> <dbl> <dbl>
#> 1 1 2
#> 2 4 5
#> 3 7 8
由reprex package(v0.2.1)于2019-03-08创建
事实证明,只有select
支持字符串和字符向量。如文档所述,“这与字符串不明确的其他动词不同。” 请参见上一示例dplyr::select
。
# Two alternatives; both work with `select`.
df %>%
select(var1, var2)
#> # A tibble: 3 x 2
#> var1 var2
#> <dbl> <dbl>
#> 1 1 2
#> 2 4 5
#> 3 7 8
df %>%
select(c(var1, var2))
#> # A tibble: 3 x 2
#> var1 var2
#> <dbl> <dbl>
#> 1 1 2
#> 2 4 5
#> 3 7 8
# `arrange` only works with lists on comma separated unquoted variable names.
df %>%
arrange(var1, var2)
#> # A tibble: 3 x 3
#> var1 var2 var3
#> <dbl> <dbl> <dbl>
#> 1 1 2 3
#> 2 4 5 6
#> 3 7 8 9
df %>%
arrange(c(var, var2))
#> Error: incorrect size (4) at position 1, expecting : 3
由reprex package(v0.2.1)于2019-03-08创建