с коробочками в R - PullRequest
       14

с коробочками в R

1 голос
/ 04 мая 2020

Я пытаюсь использовать lapply для создания множества диаграмм в R. При создании диаграмм с помощью функции ggplot я получаю правильный вывод. Когда я пытаюсь передать функцию построения графика через lapply, используя colnames, функция не работает должным образом. Правильный график и примеры неправильных графиков прилагаются.

doPlot = function(var1) {

  # Create the plot object
  ggobj = ggplot(wdbc_train, aes(x = diagnosis,y=var1)) + geom_boxplot()

  # Add some titles and axis labels
  ggobj = ggobj + ggtitle(var1) + xlab("diagnosis") + 
    ylab(var1)
}

lapply(colnames(wdbc_train),doPlot)

Правильный

correct

Неверный

incorrect

Ответы [ 2 ]

2 голосов
/ 04 мая 2020

Вам необходимо get данные из названной переменной.

doPlot = function(var1) {

  # Create the plot object 
  ggobj = ggplot(wdbc_train, aes(x = diagnosis, y=get(var1))) + 
    geom_boxplot()

  # Add some titles and axis labels 
  ggobj = ggobj + ggtitle(var1) + xlab("diagnosis") + ylab(var1) 
}

doPlot = function(var1) {

  # Create the plot object 
  ggobj = ggplot(iris, aes(x = Species, y=get(var1))) + geom_boxplot()

  # Add some titles and axis labels 
  ggobj = ggobj + ggtitle(var1) + xlab("Species") + ylab(var1) 
}

p <- lapply(colnames(iris)[-5], doPlot)

library(gridExtra)
grid.arrange(grobs=p)

enter image description here

1 голос
/ 04 мая 2020

Когда вы передаете var1 в функцию doPlot, это просто строка. Это должно быть интерпретировано как столбец данных.

Мы можем использовать нестандартную оценку (NSE) с sym и !! здесь.

library(ggplot2)
library(rlang)

doPlot = function(df, var1) {
  # Create the plot object
  ggobj = ggplot(df, aes(diagnosis,y = !!sym(var1))) + geom_boxplot()
  # Add some titles and axis labels
  ggobj + ggtitle(var1) + xlab("diagnosis") + ylab(var1)
}

затем примените его к каждому столбцу, который даст вам список графиков в list_plot.

list_plot <- lapply(colnames(wdbc_train), doPlot, df = wdbc_train)

Ранее это было возможно при использовании aes_string, в котором вы могли передавать имя столбца в виде строки, но это не рекомендуется.

...