【问题标题】:R- pass argument to ggplot in functionR-将参数传递给函数中的ggplot
【发布时间】:2018-08-05 12:37:44
【问题描述】:

如果我想要1-x x 轴,我有一个关于如何将参数传递给 ggplot 的问题。该函数用于在我的数据框中指定列名。

假设我的数据框看起来像

x1    x2    x3   x4
0.1   0.2   0.3  0.4
0.3   0.5   0.7  0.9
0.4   0.6   0.8  0.2     

我有一个函数

myfunction<- function(x, y, convert = False){

if (flip) {
  ggplot(data = mydata, aes(x=1-get(x), y=get(y))) + geom_line() + 
  xlab(x) + ylab(y)
    } else {
  ggplot(data = mydata, aes(x=get(x), y=get(y))) + geom_line() + 
  xlab(x) + ylab(y)
    }
}

convert = False 时有效,但如果我想绘制 myfunction(x1, x2, convert = TRUE),我的 x-lab 仍然是 "x1",而不是 "1-x1"。我试图编码xlab(1-get(x)),但它不起作用。任何人都知道如何将 x-label 打印为"1-x1",其中 x1 是数据框中的列名?

【问题讨论】:

    标签: r function ggplot2 arguments


    【解决方案1】:

    根据函数参数,convert 似乎是 flip。除了使用get 来修改'x' 参数,我们可以在将参数转换为quosures 后使用mutate 来做到这一点

    myfunction<- function(mydata, x, y, convert = FALSE){
        x <- enquo(x)
        y <- enquo(y)
        xnew <- quo_name(x)
    if (convert) {
       mydata %>%
             mutate(!! (xnew) := 1- !!(x)) %>%
             ggplot(., aes_string(xnew, quo_name(y))) +
                   geom_line() + 
                   xlab(paste0("1 - ", xnew))
       
    } else {
    
         ggplot(mydata, aes_string(xnew, quo_name(y))) +
                 geom_line()
    
        }
        
    }
    
    myfunction(df1, x1, x2, convert = TRUE)
    

    -输出

    myfunction(df1, x1, x2, convert = FALSE)
    

    -输出

    数据

    df1 <- structure(list(x1 = c(0.1, 0.3, 0.4), x2 = c(0.2, 0.5, 0.6), 
    x3 = c(0.3, 0.7, 0.8), x4 = c(0.4, 0.9, 0.2)), .Names = c("x1", 
    "x2", "x3", "x4"), class = "data.frame", row.names = c(NA, -3L
    ))
    

    【讨论】:

    • 谢谢!当我尝试运行代码时,它会提示错误消息Error in mutate_impl(.data, dots) : Evaluation error: non-numeric argument to binary operator.。可能是因为我的实际函数类似于myfunction&lt;- function(mydata, x = c("x1", "x2"), y = c("x2", "x3"), convert = False),而我通过myfunction(mydata, x = "x2", y="x3") 调用我的函数。你知道如何解决这个问题吗?
    • @Helen 我提供了一个可重现的示例和函数的参数。你可以在上面测试它
    • 这个函数非常适合这个例子。问题是我还在函数体中使用了y &lt;- match.arg(y),如果用户指定了“x2”或“x3”以外的y变量,则会提示错误。有没有办法修改你的解决方案,但仍然需要像 x = c("x1", "x2"), y = c("x2", "x3") 这样的参数?
    • @Helen 您传递的参数是否是带引号的字符串。在您的帖子中,该函数采用未加引号的变量名称。从 cmets 现在还不清楚。为什么你通过 x 有两个列名和 y 相同
    • 对不起,我在发布问题时犯了一个错误。我确实在原始函数中使用了带引号的变量名,但现在我已经更改了它。谢谢!现在可以了。
    猜你喜欢
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 2020-03-06
    • 2012-06-07
    • 2017-12-06
    • 1970-01-01
    相关资源
    最近更新 更多