在R中创建S4类对象,并使用省略号传递一些参数

时间:2018-07-28 20:37:21

标签: r s4 do.call

在命名参数时,如何使用省略号传递给函数的一些参数创建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] )) )

1 个答案:

答案 0 :(得分:0)

您有正确的主意, 您只需创建正确传递给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"包装在列表中即可。