функциональное программирование с помощью ggplot2 в R - NSE - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть график, который я повторяю много раз, просто с разными переменными, поэтому я хочу превратить его в функцию:

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 <- функция (data, xvar, yvar, yvarse c, groupvar, ...) {</p>

  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 я получаю ошибку:

Ошибка в yvarse c * param: non-Numberri c аргумент бинарного оператора

Предлагаемое решение от @ 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

1 Ответ

0 голосов
/ 15 апреля 2020

Я думаю, это потому, что ваш 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")
...