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