【问题标题】:How to deal with strings as values in functions? [duplicate]如何将字符串作为函数中的值处理? [复制]
【发布时间】:2020-10-01 23:40:49
【问题描述】:

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

因此,如果没有函数,我会使用 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() 和类似的东西,但没有任何效果。

【问题讨论】:

    标签: r string function ggplot2


    【解决方案1】:

    您可以在此处使用aes_string,它接受字符串参数而不是aes,但这已被弃用。更好的方法是使用 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")
    

    【讨论】:

    • 太棒了,谢谢你的回复!现在一切都解决了。
    猜你喜欢
    • 1970-01-01
    • 2018-09-23
    • 2019-06-11
    • 2011-11-17
    • 1970-01-01
    • 2020-01-18
    • 2021-12-28
    • 2013-06-21
    • 1970-01-01
    相关资源
    最近更新 更多