【问题标题】:Convert vector like c("x","y","z") to function(x , y, z){}将像 c("x","y","z") 这样的向量转换为函数(x , y, z){}
【发布时间】:2015-10-30 02:32:18
【问题描述】:

如何在R中将c("x","y","z")之类的向量转换为function(x , y, z){}

我正在寻找类似formalArgs() 的反向功能。

请注意,我知道as.function(alist(x=,y=,{})),但我不知道如何从给定向量中插入x=y=

【问题讨论】:

    标签: r function vector arguments


    【解决方案1】:

    基本上要让它工作,你需要打电话

    as.function(alist(x=, y=, z=, {}))`
    

    相当于

    as.function(alist(x=bquote(), y=bquote(), z=bquote(), {}))
    

    第二种形式很好,因为我们有一组alist 的命名参数,可以使用列表和do.call 以编程方式提供:

    l <- list(x=bquote(), y=bquote(), z=bquote(), bquote({}))
    as.function(do.call(alist, l))
    # function (x, y, z) 
    # {
    # }
    

    剩下的就是从变量名列表中以编程方式构造我们的列表l,这可以使用setNamesreplicate来完成:

    vec <- c("x","y","z")
    as.function(do.call(alist, c(setNames(replicate(length(vec), bquote(), F), vec),
                                 bquote({}))))
    # function (x, y, z) 
    # {
    # }
    

    【讨论】:

      【解决方案2】:

      参数只是一个命名列表。对内部配对列表的强制是自动的。

      #argument list
      p<-c("x","y","z")
      args<-vector("list",length(p))
      for(i in seq(args)) args[[i]]<-substitute()
      names(args)<-p
      
      #set a default value for y for the sake of example
      args$y<-2
      
      #construct function
      body<-quote(x+y+z)
      f<-as.function(c(args,body))
      
      #test it
      f(1,z=3)
      #[1] 6
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-26
        • 2017-08-12
        • 1970-01-01
        • 2010-11-25
        • 2011-06-12
        相关资源
        最近更新 更多