【问题标题】:functional programming with ggplot2 in R - NSE在 R 中使用 ggplot2 进行函数式编程 - NSE
【发布时间】:2020-04-15 18:17:13
【问题描述】:

我有一个情节,我重复了很多次,只是用不同的变量,所以我想把它变成一个函数:

getSecPlot <- function(data, xvar, yvar, yvarsec, groupvar, ...){

  sec_plot <- ggplot(data, aes_string (x = xvar, group = groupvar)) +
    geom_col(aes_string(y = yvar, fill = groupvar), position = "dodge") +
    geom_line(aes_string(y = yvarsec), color = groupvar) 
}

test <- getSecPlot(freqSevDataAge, xvar = get("agegroup"), yvar = "severity", 
yvarsec = "frequency", groupvar = "gender")

我得到一个错误:

未知颜色名称:性别

我认为这是因为颜色被评估为color = "gender",因为aes_string

如何解决这个问题?我尝试使用enquo()!!,但没有奏效。有什么建议吗?

也与此相关,我想通过参数缩放yvarsec。我已经为你做了以下事情:

getSecPlot

  param <- max(as.numeric(freqSevData$yvar), na.rm = TRUE)/max(as.numeric(freqSevData$yvarsec), na.rm = TRUE)

  sec_plot <- ggplot(data, aes_string (x = xvar, group = groupvar)) +
    geom_col(aes_string(y = yvar, fill = groupvar), position = "dodge") +
    geom_line(aes_string(y = as.numeric(yvarsec) * as.numeric(param)), color = groupvar) +
    theme_pubclean()

}

它返回一个没有线的情节。同样,我相信这与 NSE 和 aes_string 有关。

没有as.numeric 我得到一个错误:

yvarsec * 参数中的错误:二进制运算符的非数字参数

@linog 提出的解决方案

getSecPlot <- function(data, xvar, yvar, yvarsec, groupvar, ...){

    df[,"param"] <- max(as.numeric(data[, yvar]), na.rm = TRUE)/max(as.numeric(data[, yvarsec]), na.rm = TRUE)
    df[,"param"] <- df[,"param"]* df[, yvarsec]

  sec_plot <- ggplot(data, aes_string (x = xvar, group = groupvar)) +
    geom_col(aes_string(y = yvar, fill = groupvar), position = "dodge") +
    geom_line(aes_string(y = "param", color = groupvar)) +
    theme_pubclean()

}

test <- getSecPlot(freqSevDataAge, xvar = get("agegroup"), 
yvar = "severity", yvarsec = "frequency", groupvar = "gender")
    test

【问题讨论】:

    标签: r ggplot2 nse


    【解决方案1】:

    我认为这是因为您的color 参数超出了aes_string。您应该更正为aes_string(y = yvarsec, color = groupvar)

    尝试以下更正。

    顺便说一句,我认为您不应该在函数调用中使用 get,因为您不希望名称与值匹配(这是为您执行此操作的 aes_string

    getSecPlot <- function(data, xvar, yvar, yvarsec, groupvar, ...){
    
    param <- as.numeric(
      freqSevData[, max(get(yvar), na.rm = TRUE)/max(get(yvarsec), na.rm = TRUE)]
    )
    df[,"param" := get(yvarsec)*param]
    
      sec_plot <- ggplot(data, aes_string (x = xvar, group = groupvar)) +
        geom_col(aes_string(y = yvar, fill = groupvar), position = "dodge") +
        geom_line(aes_string(y = "param")) +
        theme_pubclean()
    }
    
    test <- getSecPlot(freqSevDataAge, xvar = get("agegroup"), yvar = "severity", 
    yvarsec = "frequency", groupvar = "gender")
    

    【讨论】:

    • get 确实如此,但是那个参数是我需要的一个例外...是的,它解决了问题 facepal,谢谢... ,我编辑了问题的发送部分,有什么想法吗?
    • 我编辑了答案。我建议您首先计算您的列并使用aes_string(y = "param") 坚持使用 SE。它回答了你的问题吗?
    • 我收到建议的解决方案错误:Error in [.data.table(data, , yvar) : j (the 2nd argument inside [...]) is a single symbol but column name 'yvar' is not found. Perhaps you intended DT[, ..yvar]. This difference to data.frame is deliberate and explained in FAQ 1.1.
    • 我把它包含在我的问题中,我在那里做错了吗?
    • 你没有提到你正在使用data.table。使用data.table,SE 更容易(参见blog poste I wrote on the subject)。我给你一个答案
    猜你喜欢
    • 2013-10-01
    • 2018-05-04
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多