ggplot2 не распознает столбец в вызове функции - PullRequest
1 голос
/ 20 сентября 2019

мой код работает хорошо и строит графики, когда я бегал в консоль.однако, когда я помещаю это в функцию, я получаю сообщение об ошибке, указывающее, что один из столбцов не может быть найден.

"Error in tapply(X = X, INDEX = x, FUN = FUN, ...) :   
object 'm.raw' not found"

во-первых, фрейм данных, который я использую для своего графика, точно такой же, как показано ниже

DF =
lbls    raw.1   raw.2   raw.3   m.raw   imp.1   imp.2   imp.3   m.imp
A1  0.020   0.031   0.032   0.028   11.266  17.408  17.622  15.432
A2  0.023   0.024   0.036   0.028   12.732  13.452  20.034  15.406
A3  0.002   0.022   0.016   0.013   1.344   12.111  9.011   7.489
A4  0.015   0.031   0.021   0.023   8.641   17.575  11.790  12.669
A5  0.016   0.046   0.066   0.043   8.764   25.728  36.991  23.828
A7  0.009   0.029   0.029   0.022   4.924   16.348  16.364  12.545
A7  0.014   0.025   0.029   0.023   7.806   13.747  16.341  12.631

в секунду, когда я запустил приведенный ниже код в консоли (заменив x и y) с фактическими именами переменных (x = lbls; y = m.raw), я получаю графики без каких-либо сообщений об ошибках.
однако, когда я помещаю код в функцию (заменяя реальные имена переменных на x и y)я получаю сообщение об ошибке, указанное выше

# function to plot
dot.pa <- function(mydata, x, y) {
  pa <-  ggplot(data = mydata, (aes(x = reorder(x, y), y))) +
    geom_point() +
    labs(x = "predicts", y = "weights") +
    coord_flip()

  geom.text.size = 10
  theme.size = (10*1.25) # geom.text.size

  pa2 <- pa + theme_minimal() +
    geom_segment(aes(yend=0.00, xend = x)) +
    geom_text(aes(y, label = round(y, 3), 
              family = "mono", size = geom.text.size,
              vjust = -0.5, hjust = 0.9))

  pa3 <- pa2 + 
           theme(text = element_text(family = "mono", size = theme.size), 
                 axis.text.x = element_text(size = theme.size, family = "mono"),
                 axis.text.y = element_text(size = theme.size, family = "mono")) +
           theme(legend.position = "none")
  return(pa3)
}

#plot function
dot.pa(DF, x=lbls, y=m.raw)

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Более простая функция, чтобы показать проблему:

make_plot <- function(mydata, x, y) {
  ggplot(mydata, aes(x=x, y=y)) + geom_point()
}

Вызов без кавычек.R ожидается, что Species будет существовать как объект в среде:

make_plot(iris, Species, Sepal.Width)
Error in FUN(X[[i]], ...) : object 'Species' not found

Вызов со строками символов не выдает ошибку, но также не будет работать, как мы могли бы ожидать, потому что ggplot ожидаютпеременные без кавычек в aes:

make_plot(iris, "Species", "Sepal.Width")

enter image description here

Вызов с фактическими векторами, которые вы хотите построить, работает:

make_plot(iris, iris$Species, iris$Sepal.Width)

enter image description here

Чтобы вызвать строки символов, но получить ожидаемый результат, нам нужно преобразовать в name и затем использовать !!:

make_plot2 <- function(mydata, x, y) {
  ggplot(mydata, aes(x=!!as.name(x), y=!!as.name(y))) + geom_point()
}

make_plot2(iris, "Species", "Sepal.Length")

enter image description here

0 голосов
/ 21 сентября 2019

с ответом теофилом, и, прочитав немного больше о квази-цитатах, я смог найти решение.ниже приведен фрагмент изменений кода

dot.pa <- function(mydata, x, y) {

x <- enquo(x)
y <- enquo(y)

pa <-  ggplot(data = mydata, (aes(x = reorder(!!x, !!y), !!y))) +
geom_point() + 
labs(x = "predicts", y = "weights") + 
coord_flip()


return(pa)
}

, я добавил x и y в кавычки, а затем в кавычки все экземпляры функций !! x и !! y, чтобы заставить его работать без ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...