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

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

R-скрипт

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

Дополнительный

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


person Jefftopia    schedule 04.02.2014    source источник
comment
Завершающий знак плюса: geom_point() +   -  person joran    schedule 04.02.2014
comment
Да, это было большим сумасшествием с моей стороны.   -  person Jefftopia    schedule 04.02.2014


Ответы (3)


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

person Christopher Louden    schedule 04.02.2014

Ответ Кристофера совершенно правильный. Позвольте мне добавить, что 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() останется на месте, чтобы отменить действие последнего знака +; в противном случае это не работает.

person krlmlr    schedule 04.02.2014
comment
Это оба полезных способа избежать глупых ошибок, спасибо. - person Jefftopia; 04.02.2014

В версии 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() в качестве последнего слоя.

person Uwe    schedule 05.02.2017