Ошибка в seq(min(x), max(x), length = timesteps): объект 'a' не найден в функции

Я пытаюсь создать функцию, которая будет отображать мои результаты. Вторая строка в функции даст мне следующую ошибку:

Ошибка в seq(min(x), max(x), length = timesteps): объект 'a' не найден'

Ясно, что a и b существуют, потому что игра может их прочитать, и первая строка функции тоже отлично работает. Когда я использую код вне функции, он тоже работает... Я не знаю, что мне там не хватает.

library(mgcv)
library(ggplot2)
theme_set(theme_bw())

set.seed(100)
dd <- data.frame(a=1:100,b=round(rnorm(100,mean=100),1))

m <- gam(formula = b ~ s(a, k = 64, bs = "ad"), data = dd, method = "REML", select = TRUE)

plot<-function(model,x,y,timesteps){
ggplot(model, aes_string(x = deparse(substitute(x)), y=deparse(substitute(y)))) +  geom_point()
pred <- with(model, data.frame(x = seq(min(x), max(x), length = timesteps)))

# Error in seq(min(x), max(x), length = timesteps) : object 'a' not found

pred <- cbind(pred, as.data.frame(predict(m, pred, se.fit = TRUE, unconditional = TRUE)))
pred <- transform(pred,
                  Fitted = fit,
                  Upper = fit + (2 * se.fit),
                  Lower = fit - (2 * se.fit))


ggplot(model, aes(x = x, y=y)) +
    geom_point() +
    geom_ribbon(data = pred, mapping = aes(x = x, ymin = Lower, ymax = Upper),
                fill = "#9ecf7f", colour = NA, alpha = 0.7, inherit.aes  = FALSE) +
    geom_path(data = pred, mapping = aes(x = x, y = Fitted), inherit.aes = FALSE,
              size = 1)
}

plot(dd,a,b,64)

person scriptgirl_3000    schedule 18.09.2017    source источник


Ответы (1)


Пожалуйста, проверьте, работает ли это. Я просто перезаписал всю вашу функцию:

plot <- function(model, x, y, timesteps){
    library(ggplot2)

    # Use get instead of aes_string
    ggplot(model, aes(get(x), get(y))) +  
        geom_point()

    # To extract min X value we'll use it's position in data frame
    whichX <- colnames(model) == x
    pred <- data.frame(seq(min(model[, whichX]), max(model[, whichX]), 
                           length = timesteps))
    colnames(pred) <- x
    pred <- cbind(pred, as.data.frame(predict(m, pred, se.fit = TRUE, unconditional = TRUE)))
    pred <- transform(pred,
                      Fitted = fit,
                      Upper = fit + (2 * se.fit),
                      Lower = fit - (2 * se.fit))

    ggplot(model, aes(get(x), get(y))) +
        geom_point() +
        geom_ribbon(data = pred, mapping = aes(x = get(x), ymin = Lower, ymax = Upper),
                    fill = "#9ecf7f", colour = NA, alpha = 0.7, inherit.aes  = FALSE) +
        geom_path(data = pred, mapping = aes(x = get(x), y = Fitted), inherit.aes = FALSE,
                  size = 1)
}
# quote your variables before passing them
# e.g.: a is not defined and you have to "a"
plot(dd, "a", "b", 64)
person pogibas    schedule 18.09.2017
comment
Исправьте опечатку и все заработает. Опечатка: пробел после < и перед - в plot < -function. - person Rui Barradas; 18.09.2017
comment
@RuiBarradas Спасибо! - person pogibas; 18.09.2017
comment
Спасибо большое, все работает! Мне бы никогда не пришла в голову идея использовать get - person scriptgirl_3000; 18.09.2017