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