Подтвердить что ты не робот

Нечисловой аргумент двоичному оператору

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

R Script

plotScatterChart <- function(data,x,y,scale=y,line=FALSE) {

    require(ggplot2)
    data$x <- as.numeric(x)
    data$y <- as.numeric(y)

    plot <- ggplot(data, aes(x, y)) + 
            geom_point() +  # aes(alpha=0.3,color=scale)
            #scale_color_gradient(high="red")

    if(line) {
        plot <- plot + geom_smooth(method="lm") 
    }

    ggsave(file="plot.svg", plot=plot, height=10, width=10)

    return(plot)
}

plotScatterChart(data=iris,x=iris$Petal.Length,y=iris$Petal.Width,line=TRUE)

Ошибка

non-numeric argument to binary operator

Extra

Другие предложения по улучшению этой функции приветствуются.

4b9b3361

Ответ 1

Ошибка связана с завершением + после geom_point(). Удалите это, и он должен работать.

Ответ 2

Кристофер отвечает совершенно правильно. Позвольте мне добавить, что ggplot также, кажется, принимает списки:

plot <- ggplot(data, aes(x, y)) +
  list(
    geom_point(),
    aes(alpha=0.3,color=scale),
    scale_color_gradient(high="red"),
    NULL
  )

К сожалению, в отличие от Python, где вы можете написать [1, 2, 3, ], конструктор list(1, 2, 3, ) создает ошибку в R. Это является причиной окончательного NULL, который с радостью игнорируется ggplot2.

Другим возможным обходным решением является запись

plot <- ggplot(data, aes(x, y)) +
  geom_point() +
  #aes(alpha=0.3,color=scale) +
  #scale_color_gradient(high="red") +
  list()

Финал list() должен оставаться на месте, чтобы отменить эффекты последнего знака +; это нет-op в противном случае.

Ответ 3

С версией 2.0.0 ggplot2 получила новую геометрию geom_blank(), которая ничего не рисует.

Его можно использовать, чтобы избежать этого типа ошибок, когда он помещен в качестве последнего слоя.

plot <- ggplot(data, aes(x, y)) +
  geom_point() +
  #aes(alpha=0.3,color=scale) +
  #scale_color_gradient(high="red") +
  geom_blank()

Использование geom_blank() таким образом аналогично обходному пути в @krlmlr answer, который использует list() как последний слой.