R中的标准评估和非标准评估
Standard evaluation and non-standard evaluation in R
我对 dplyr 函数的参数感到困惑,并且不太清楚标准评估 (SE) 或非标准评估 (NSE)。
我只想将一个变量传递给 dplyr::arrange() 但它失败了。但是,传递给 dplyr::select() 是有效的。
> library(dplyr)
> library(magrittr)
> var_name <- "mpg"
> mtcars %>% as_tibble() %>% dplyr::select(var_name)
# A tibble: 32 x 1
mpg
* <dbl>
1 21.0
2 21.0
3 22.8
4 21.4
5 18.7
6 18.1
7 14.3
8 24.4
9 22.8
10 19.2
# ... with 22 more rows
> mtcars %>% as_tibble() %>% dplyr::arrange(var_name)
Error in arrange_impl(.data, dots) :
incorrect size (1) at position 1, expecting : 32
我搜索了一个使用 SE 版本的解决方案,它有效:
> mtcars %>% as_tibble() %>% dplyr::arrange_(var_name)
为什么 dplyr::select() 与 NSE 中的 dplyr::arrange() 不同?
如何修复全局环境中的以下错误?
> as_tibble(mtcars) %>% dplyr::mutate(paste0(var_name,"_Minus1") = mtcars$mpg - 1)
Error: unexpected '=' in "as_tibble(mtcars) %>% dplyr::mutate(paste0(var_name,"_Minus1") ="
谢谢!
我们可以使用 arrange_at
获取对象
mtcars %>%
as_tibble() %>%
dplyr::arrange_at(var_name)
或者另一种选择是使用 sym
从 rlang
转换为符号并使用 !!
进行评估
mtcars %>%
as_tibble() %>%
dplyr::arrange(!! rlang::sym(var_name))
我对 dplyr 函数的参数感到困惑,并且不太清楚标准评估 (SE) 或非标准评估 (NSE)。 我只想将一个变量传递给 dplyr::arrange() 但它失败了。但是,传递给 dplyr::select() 是有效的。
> library(dplyr)
> library(magrittr)
> var_name <- "mpg"
> mtcars %>% as_tibble() %>% dplyr::select(var_name)
# A tibble: 32 x 1
mpg
* <dbl>
1 21.0
2 21.0
3 22.8
4 21.4
5 18.7
6 18.1
7 14.3
8 24.4
9 22.8
10 19.2
# ... with 22 more rows
> mtcars %>% as_tibble() %>% dplyr::arrange(var_name)
Error in arrange_impl(.data, dots) :
incorrect size (1) at position 1, expecting : 32
我搜索了一个使用 SE 版本的解决方案,它有效:
> mtcars %>% as_tibble() %>% dplyr::arrange_(var_name)
为什么 dplyr::select() 与 NSE 中的 dplyr::arrange() 不同?
如何修复全局环境中的以下错误?
> as_tibble(mtcars) %>% dplyr::mutate(paste0(var_name,"_Minus1") = mtcars$mpg - 1)
Error: unexpected '=' in "as_tibble(mtcars) %>% dplyr::mutate(paste0(var_name,"_Minus1") ="
谢谢!
我们可以使用 arrange_at
获取对象
mtcars %>%
as_tibble() %>%
dplyr::arrange_at(var_name)
或者另一种选择是使用 sym
从 rlang
转换为符号并使用 !!
mtcars %>%
as_tibble() %>%
dplyr::arrange(!! rlang::sym(var_name))