简体   繁体   English

R中的标准评估和非标准评估

[英]Standard evaluation and non-standard evaluation in R

I am confused about dplyr functions' arguments and not quite clear about standard evalution (SE) or non-standard evaluation (NSE). 我对dplyr函数的参数感到困惑,对标准评估(SE)或非标准评估(NSE)不太清楚。 I just want to pass a variable to dplyr::arrange() but it failed. 我只想将变量传递给dplyr :: arrange(),但失败了。 However, passing to dplyr::select() works. 但是,传递给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

I searched a solution using SE version and it works: 我使用SE版本搜索了一个解决方案,它可以正常工作:

> mtcars %>% as_tibble() %>% dplyr::arrange_(var_name)

Why dplyr::select() differs from dplyr::arrange() in NSE? 为什么dplyr :: select()与NSE中的dplyr :: arrange()不同?

How to fix the error below in global environment? 如何在全球环境中解决以下错误?

> as_tibble(mtcars) %>% dplyr::mutate(paste0(var_name,"_Minus1") = mtcars$mpg - 1)
Error: unexpected '=' in "as_tibble(mtcars) %>% dplyr::mutate(paste0(var_name,"_Minus1") ="

Thanks! 谢谢!

We can use arrange_at which takes objects 我们可以使用arrange_at来获取对象

mtcars %>%
   as_tibble() %>%
   dplyr::arrange_at(var_name)

Or another option is to convert to symbol with sym from rlang and evaluate with !! 或者另一个选择是从rlang转换为带有sym符号并用!!求值!!

mtcars %>%
   as_tibble() %>%
   dplyr::arrange(!! rlang::sym(var_name))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM