Помогите понять ошибку в функции, которую я определил в R - PullRequest
5 голосов
/ 27 июня 2011

Я очень плохо знаком с R и только что научился писать простые функции.Может кто-нибудь помочь мне понять, почему не работает следующая функция:

fboxplot <- function(mydataframe, varx, vary)
  {
    p <- ggplot(data=mydataframe, aes(x=varx, y=vary))
    p + geom_boxplot()
  }

col1 = factor(rep(1:3, 3))
col2 = rnorm(9)
col3 = c(rep(10,5), rep(20,4))
df = data.frame(col1 = col1, col2 = col2, col3 = col3)

Теперь, если я вызываю функцию fboxplot

fboxplot(df, col1, col2)

, я получаю ошибку Error in eval(expr, envir, enclos): object varx not found.Я также пытался

fboxplot(df, varx = col1, vary = col2)

Это дает ту же ошибку.Куда я иду не так?

Спасибо за вашу помощь.

Ответы [ 2 ]

7 голосов
/ 28 июня 2011

Функция aes в ggplot2 использует имена, подобные library(), то есть в качестве аргумента принимает имя аргумента.Если это объект, он не оценивает его, а принимает имя.Здесь он принимает varx в качестве аргумента, а не то, что varx оценивает тоже.

Это работает, если вы используете aes_string() и используете символы в качестве аргументов в вызове fboxplot():

fboxplot <- function(mydataframe, varx, vary)
  {
    p <- ggplot(data=mydataframe, aes_string(x=varx, y=vary))
    p + geom_boxplot()
  }

col1 = factor(rep(1:3, 3))
col2 = rnorm(9)
col3 = c(rep(10,5), rep(20,4))
df = data.frame(col1 = col1, col2 = col2, col3 = col3)

fboxplot(df, "col1", "col2")
6 голосов
/ 28 июня 2011

Проблема в том, что вы проходите через векторы varx и vary, в то время как функция aes ожидает имена переменных (хотя и не в виде строк). Одним из способов решения этой проблемы является использование функции aes_string, в которую можно передавать имена переменных в виде строк (хотя это и не векторы):

Должно работать следующее:

fboxplot2 <- function(mydataframe, varx, vary)   {
     p <- ggplot(data=mydataframe, aes_string(x=varx, y=vary))
     p + geom_boxplot()   }

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