将字符串作为参数传递给 R

Passing string as an argument in R

我想定期传入在代码中用作参数的字符串。对于上下文,我经常想要一个部分,我可以在其中传递过滤条件或假设,然后通过我的分析、绘图等进行处理,以使其更具交互性。

下面是一个简单的例子。我看过 eval/parse 解决方案,但它似乎使代码块不可读。有 better/cleaner/shorter 的方法吗?

column.names <- c("group1", "group2") #two column names I want to be able to toggle between for grouping
select.column <- group.options[1] #Select the column for grouping

DataTable.summary <- 
  DataTable %>% 
  group_by(select.column) %>% #How do I pass that selection in here? 
  summarize(avg.price = mean(SALES.PRICE))

好吧,这只是 tidyverse 网站的复制粘贴:link:(https://dplyr.tidyverse.org/articles/programming.html#programming-recipes)。

my_summarise <- function(df, group_var) {
  group_var <- enquo(group_var)
  print(group_var)
  df %>%
    group_by(!! group_var) %>%
    summarise(a = mean(a))
}
my_summarise(df, g1)
#> <quosure>
#> expr: ^g1
#> env:  global
#> # A tibble: 2 x 2
#>      g1     a
#>   <dbl> <dbl>
#> 1     1  2.5 
#> 2     2  3.33

但我想我说明了你的问题。我认为你真正想做的就像上面的代码一样,即创建一个函数。

您可以对问题中的示例使用 group_by_ 函数:

library(dplyr)

x <- data.frame(group1 = letters[1:4], group2 = LETTERS[1:4], value = 1:4)
select.colums <- c("group1", "group2")

x %>% group_by_(select.colums[2]) %>% summarize(avg = mean(value))
# A tibble: 4 x 2
#  group2   avg
#  <fct>  <dbl>
# 1 A          1
# 2 B          2
# 3 C          3
# 4 D          4

dplyr 中的 *_ 系列功能也可能提供您所追求的更通用的解决方案,尽管 dplyr 文档说它们已被弃用 (?group_by_) 并且可能在某个时候消失。使用整洁评估语法的上述解决方案的类似表达式似乎是:

x %>% group_by(!!sym(select.colums[2])) %>% summarize(avg = mean(value))

还有几列:

x %>% group_by(!!!syms(select.colums)) %>% summarize(avg = mean(value))

这将创建一个由 dplyr 评估的 symbol out of a string

我推荐使用 group_by_at()。它支持单个字符串或字符向量:

nms <- c("cyl", "am")

mtcars %>% group_by_at(nms)