在 R 中创建一个 S4 class 对象,其中一些参数使用省略号传递
Create an S4 class object in R with some of the arguments passed using the ellipsis
如何在命名参数时使用省略号传递给函数的一些参数来创建 S4 class 的新对象?
示例:
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 并遵守 class 的插槽类型/保留传递给的类型富?
newClassObj <- do.call( "new", as.list( c("Class"="myClass1", cur_args[args_to_keep] )) )
你的想法很对,
您只需正确创建传递给 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"
包装在一个列表中。
如何在命名参数时使用省略号传递给函数的一些参数来创建 S4 class 的新对象?
示例:
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 并遵守 class 的插槽类型/保留传递给的类型富?
newClassObj <- do.call( "new", as.list( c("Class"="myClass1", cur_args[args_to_keep] )) )
你的想法很对,
您只需正确创建传递给 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"
包装在一个列表中。