在函数中向ggplot中传递变量的正确方法,在R中不能解释为字符串。

问题描述 投票:0回答:1

我的代码。

function (var1, var2) {
    if (var1 = flowrate) {label <- bquote('Flow rate ('*mu~'litre)'))}
    else if (var1 = stress) {label <- bquote('Average velocity ('*m^2*s^-1*')')}
    ggplot{} + 
    ... +
    ylab(label)
}

我要的是 ylab(label) 部分来使用公式,但这样一来,它就会以引号字符串的形式进行绘图和打印。例如,当 var1 = flowrate,它打印 bquote('Flow rate ('*mu~'litre)') 作为y轴,而不是解释真正的含义。这里也有类似的情况,但不能适用于我的情况。把一个字符串赋给一个没有双引号的对象。

这一定是一个很粗糙的方法,因为我不知道正确的方法,但我会感谢任何修复这个问题的建议或更好的方法来实现这个目标。

谢谢你的时间!我的代码:function (var1, var2) { if (var1, var2)

r function variables ggplot2 quoting
1个回答
2
投票

这里是另一个选择,使用你的 sampleDataaes_string

sampleData <- data.frame(Sample = sample(10:20, 8), randomNum = rnorm(8)
                         , fruit = fruit[48:55], Blender = 
                           c('a','b','c','a','b','c','a','b'))


plot_it <- function(df, x, y, fill) {

  if (y == 'randomNum') {label <- bquote('Flow rate ('*mu~'litre)')}
  else if (y == 'Sample') {label <- bquote('Average velocity ('*m^2*s^-1*')')}
  else {label <- 'ylab'}

  ggplot(df, aes_string(x, y, fill = fill)) + 
    geom_boxplot() +
    ylab(label)
}

plot_it(sampleData, "Blender", "randomNum", 'fruit')

编辑:如 aes_string 已被软性废弃,这里还有另一个选择(似乎是当前的),即使用 sym!! 将引用的字符串变为一个变量,如图所示。此处.

plot_it_sym <- function(df, x, y, fill) {

  vars <- syms(c(x, y, fill))

  if (y == 'randomNum') {label <- bquote('Flow rate ('*mu~'litre)')}
  else if (y == 'Sample') {label <- bquote('Average velocity ('*m^2*s^-1*')')}
  else {label <- 'ylab'}

  ggplot(df, aes(x = !!vars[[1]], y = !!vars[[2]], fill = !!vars[[3]])) + 
    geom_boxplot() +
    ylab(label)
}

plot_it_sym(sampleData, 'Blender', 'randomNum', 'fruit')

2
投票

对不起,一些奇怪的错误,主要是由于不完整的发生在 if-else 语句,但现在它的工作。不删除这个问题,因为有人可能会觉得这很有用。改编自:

library(tidyverse)

     sampleData <- data.frame(Sample = sample(10:20, 8), randomNum = rnorm(8)
                              , fruit = fruit[48:55], Blender = 
                             c('a','b','c','a','b','c','a','b'))

     sampleData
#>   Sample   randomNum     fruit Blender
#> 1     14  0.50009746 mandarine       a
#> 2     10  1.37473946     mango       b
#> 3     11  1.71557219  mulberry       c
#> 4     18  0.40837073 nectarine       a
#> 5     16  2.18151795       nut       b
#> 6     20 -1.59481280     olive       c
#> 7     12 -0.01976708    orange       a
#> 8     17 -1.34631557    pamelo       b

     boxViolinPlot.fun <- function(data, fill, x, y) {
        # except `data`, other input variables should be double quoted!
        library(ggplot2)
        if (y == "randomNum") 
            {label <- bquote('Flow rate ('*mu~'litre)')}
        if (y == "Sample") 
            {label <- bquote('Average velocity at outlet ('*m^2*s^-1*')')}
        else {ylab <- 'ylab'}
        ggplot(data, aes(x = .data[[x]], y = .data[[y]], fill = .data[[fill]]
                         )) + geom_boxplot(# varwidth = .1, 
                width = 0.5, alpha = 0.75) + ylab(label) #+ scale_y_log10()
    }

    boxViolinPlot.fun(data = sampleData, x = "Blender", y = "randomNum", 
                  fill = "fruit")

创建于2020-06-12 重读包 (v0.3.0)

© www.soinside.com 2019 - 2024. All rights reserved.