【问题标题】:Create an S4 class object in R with some of the arguments passed using the ellipsis在 R 中创建一个 S4 类对象,其中一些参数使用省略号传递
【发布时间】:2018-07-28 20:37:21
【问题描述】:

如何在命名参数的同时使用传递给使用省略号的函数的一些参数来创建 S4 类的新对象?

例子:

foo <- function(a, ...){

  cur_args <- lapply(match.call(expand.dots=TRUE)[-1], deparse)

  args_to_keep <- names(cur_args) %in%  slotNames("myClass1")

  newClassObj <- new("myClass1", what can go here??? )
}

有什么方法可以使用 do.call 并遵守类的槽类型/保留传递给 foo 的类型?

newClassObj <- do.call( "new", as.list( c("Class"="myClass1", cur_args[args_to_keep] )) )

【问题讨论】:

    标签: r s4 do.call


    【解决方案1】:

    你有正确的想法, 您只需要正确创建传递给new 的参数列表:

    setClass("A", slots=c(x="numeric"))
    foo <- function(...) {
        dots <- list(...)
        valid_slots <- dots[intersect(names(dots), slotNames("A"))]
        do.call(new, c(list(Class="A"), valid_slots))
    }
    
    > foo(x=1, y=2)
    An object of class "A"
    Slot "x":
    [1] 1
    

    c 可用于将列表相互附加, 所以你只需要将Class="A" 包装在一个列表中。

    【讨论】:

    • 谢谢;因此,我将不得不合并省略号之外的参数名称以获得完整列表。
    • 您可以简单地执行valid_slots$a &lt;- a 之类的操作,或者将您的方法与match.call 一起使用。
    猜你喜欢
    • 1970-01-01
    • 2017-07-05
    • 2013-04-25
    • 1970-01-01
    • 2019-02-01
    • 2013-06-27
    • 2017-03-02
    • 2021-11-22
    • 2021-12-26
    相关资源
    最近更新 更多