Помещение функций в фрейм данных

Кажется возможным назначить вектор функций в 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"), }

Почему это работает, а прямой путь - нет, я не знаю. Я подозреваю, что делать это в любом рабочем коде было бы "плохо".

Другие вопросы по тегам