В 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)