代码之家  ›  专栏  ›  技术社区  ›  Museful

将函数放入数据帧

  •  2
  • Museful  · 技术社区  · 11 年前

    似乎可以在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 回复  |  直到 9 年前
        1
  •  3
  •   Christopher Louden    11 年前

    不,不能直接将函数放入数据帧中。

    但是,您可以预先定义函数,并将它们的名称放在数据帧中。

    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 see将对象的类作为函数,查找适当的方法 as.data.frame() ( as.data.frame.function() )但找不到。这会导致 as.data.frame.default() 这一定是一个包装 stop() 用你报告的信息打电话。

    简而言之,他们似乎没有为该类实现它。

        2
  •  1
  •   Alan    8 年前

    虽然不能将函数或其他对象直接放入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"), }
    

    我不知道为什么直接路径不起作用。我怀疑在任何生产代码中这样做都是“坏事”。