Помещение функций в фрейм данных
Кажется возможным назначить вектор функций в R следующим образом:
F <- c(function(){return(0)},function(){return(1)})
так что они могут быть вызваны следующим образом (например): F[[1]]()
,
Это создало у меня впечатление, что я могу сделать это:
DF <- data.frame(F=c(function(){return(0)}))
что приводит к следующей ошибке
Ошибка в as.data.frame.default(x[[i]], необязательно = TRUE): невозможно принудительно привести класс ""function"" к data.frame
Означает ли это, что невозможно поместить функции во фрейм данных? Или я что-то не так делаю?
2 ответа
Нет, вы не можете напрямую поместить функцию в фрейм данных.
Однако вы можете заранее определить функции и поместить их имена во фрейм данных.
foo <- function(bar) { return( 2 + bar ) }
foo2 <- function(bar) { return( 2 * bar ) }
df <- data.frame(c('foo', 'foo2'), stringsAsFactors = FALSE)
Тогда используйте do.call()
использовать функции:
do.call(df[1, 1], list(4))
# 6
do.call(df[2, 1], list(4))
# 8
РЕДАКТИРОВАТЬ
Вышеупомянутый обходной путь будет работать, пока у вас есть именованная функция.
Кажется, проблема в том, что R видит класс объекта как функцию, ищет подходящий метод для as.data.frame()
(т.е. as.data.frame.function()
) но не могу найти его. Это вызывает призыв к as.data.frame.default()
который довольно должен является оберткой для stop()
позвоните с сообщением, о котором вы сообщили.
Короче говоря, они просто не реализовали это для этого класса.
Хотя вы не можете поместить функцию или другой объект непосредственно в data.frame, вы можете заставить его работать, если вы используете матрицу.
foo <- function() {print("qux")}
m <- matrix(c("bar", foo), nrow=1, ncol=2)
df <- data.frame(m)
df$X2[[1]]()
Урожайность:
[1] "qux"
И содержимое df выглядит так:
X1 X2
1 bar function () , {, print("qux"), }
Почему это работает, а прямой путь - нет, я не знаю. Я подозреваю, что делать это в любом рабочем коде было бы "плохо".