1

我有一些变量名指定为字符串(例如来自 Shiny 应用程序的输入),我想在我的 dplyr 和 ggplot2 代码中使用它们,就好像它们是变量一样。

我通过反复试验让它工作,但我觉得必须有更好的方法。执行这些操作的更好方法是什么?

library(rlang)
library(ggplot2)
library(dplyr)

someString <- "g1"

df <- tibble(
  g1 = c(1, 1, 2, 2, 2),
  g2 = c(1, 2, 1, 2, 1),
  a = sample(5), 
  b = sample(5)
)

my_summarise <- function(df, group_var) {
  print(group_var)

  df %>%
    group_by(!!group_var) %>%
    summarise(a = mean(a))
}

my_plot <- function(df, group_var) {
  print(group_var)

  ggplot(data = df %>% 
           group_by(!!group_var) %>%
           summarise(a = mean(a)), 
         aes_string(x = quo_name(group_var), y = "a")) +
    geom_bar(stat = "identity")
}

my_summarise(df, quo(UQ(sym(someString))))

my_plot(df, quo(UQ(sym(someString))))
4

2 回答 2

2

这些选项中的任何一个都可能更简单:

my_summarise <- function(df, group_var) {
  print(group_var)

  df %>%
    #Either works
    group_by_at(.vars = group_var) %>%
    #group_by(!!sym(group_var)) %>%
    summarise(a = mean(a))
}

my_summarise(df,someString)

my_plot <- function(df, group_var) {
  print(group_var)

  ggplot(data = df %>% 
           group_by_at(.vars = group_var) %>%
           #group_by(!!sym(group_var)) %>%
           summarise(a = mean(a)), 
         aes_string(x = group_var, y = "a")) +
    geom_bar(stat = "identity")
}

my_plot(df, someString)

...您可以在其中使用group_bygroup_by_at

于 2017-08-01T16:56:03.730 回答
0

打电话my_summarise(df, as.name(someString))呢?

于 2017-08-01T16:52:05.427 回答