首页 > 解决方案 > 如何将字符串作为函数中的值处理?

问题描述

我发现很难提出一个适合的问题,所以我用一个例子来说明我的问题。我想使用特定函数为我的数据集中的多个变量创建类似的图。该函数创建一个汇总数据框并生成一个图。

因此,如果没有函数,我会使用 summarySE() 函数(source)执行以下操作

library(ggplot2)
library(plyr)

#data
df <- data.frame(case=rep(1:5,3),
                 value=rnorm(15))

#summarise
df_sum <- summarySE(df, "value", groupvars=c("case"))

#plot
ggplot(df_sum, aes(x=case, y=value)) +
  geom_point()

现在我尝试编写一个函数,该函数接受一个数据帧和该数据帧中的一个变量,并生成上面的图。

#function reproducing a nonsensical plot
f <- function(data,var){
  data_sum <- summarySE(data, var, groupvars=c("case"))
  x <- ggplot(data_sum, aes(x=case, y=var)) +
    geom_point()
  return(x)
}

f(df,"value")

我想我可以从 df_sum 中的汇总变量的名称与 df 中的变量相同的事实中受益。但是因为 ggplot() 采用了我在 f() 中调用的字符串,所以它产生了一个无意义的图。

有人有一个通用的解决方案如何解决这样的问题吗?这不是我第一次在函数中使用字符串作为输入时遇到此类问题。我尝试了 unquote() 和类似的东西,但没有任何效果。

标签: rstringfunctionggplot2

解决方案


您可以aes_string在此处使用它接受字符串参数而不是aes但不推荐使用。更好的方法是使用 tidy 评估sym

library(ggplot2)
library(rlang)

f <- function(data,var) {
   data_sum <- Rmisc::summarySE(data, var, groupvars=c("case"))
   x <- ggplot(data_sum, aes(x=case, y=!!sym(var))) +  geom_point()
   return(x)
}

f(df,"value")

在此处输入图像描述


推荐阅读