В R появляется следующая ошибка: "попытка реплицировать объект типа "закрытие""

Я пытаюсь написать функцию R, которая принимает набор данных и выводит функцию plot() с набором данных, считанным в его среде. Это означает, что вам больше не нужно использовать attach (), что является хорошей практикой. Вот мой пример:

mydata <- data.frame(a = rnorm(100), b = rnorm(100,0,.2))
plot(mydata$a, mydata$b) # works just fine

scatter_plot <- function(ds) { # function I'm trying to create
    ifelse(exists(deparse(quote(ds))),
        function(x,y) plot(ds$x, ds$y),
            sprintf("The dataset %s does not exist.", ds))
    }

scatter_plot(mydata)(a, b) # not working

вот ошибка, которую я получаю:

Error in rep(yes, length.out = length(ans)) : 
  attempt to replicate an object of type 'closure'

я попробовал несколько других версий, но все они дают мне ту же ошибку. Что я делаю не так?

EDIT: я понимаю, что код не слишком практичен. Моя цель лучше понять функциональное программирование. Я написал аналогичный макрос в SAS, и я просто пытался написать его аналог в R, но я терплю неудачу. Я выбрал это в качестве примера. Я думаю, что это довольно простой пример, и все же он не работает.

1 ответов


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

вы передаете a и b вместо "a" и "b". Вместо ds$x синтаксис, вы должны использовать ds[[x]] синтаксис при вы программируете (fortunes::fortune(312)). Если вы хотите вызвать функцию таким образом, вам также придется отклонить эти аргументы. Наконец, я думаю, что вы хотите deparse(substitute()) вместо deparse(quote())

scatter_plot <- function(ds) {
  ds.name <- deparse(substitute(ds))
  if (!exists(ds.name))
    stop(sprintf("The dataset %s does not exist.", ds.name))
  function(x, y) {
    x <- deparse(substitute(x))
    y <- deparse(substitute(y))
    plot(ds[[x]], ds[[y]])
  }
}
scatter_plot(mydata)(a, b)