考虑这个清单:
l <- list(a=1:10,b=1:10,c=rep(0,10),d=11:20)
然后考虑这个示例代码(代表真正的更大代码)。 它只是根据名称选择列表中的正确元素。
参数:
object:一个最多包含四个元素的列表(即有时少于四个)。这些元素总是被称为a,b,c和d,但在列表中并不总是以相同的顺序出现。
x:要选择的元素的名称(即a,b,c或d)
slct <- function(object,x) {
if (x=="a") {
object$a
} else if (x=="b") {
object$b
} else if (x=="c") {
object$c
} else if (x=="d") {
object$d
}
}
slct(l,"d")
当你不仅仅有4个元素,而是数百个元素时,这种方法变得无法实现。 此外,我无法根据数字(例如,对象[[1]])进行选择,因为元素不会出现 每次都以相同的顺序。那么如何缩短上面的代码呢?
我在思考SAS中的宏观方法,但当然这在R中不起作用。
slct <- function(object,x) {
object$x
}
object$a
slct(object=l,x="a")
我需要更换对象$ x以使其工作但代码少于上面的代码?
答案 0 :(得分:7)
只需使用双括号参考列表中的元素即可。
l[['a']]
l[['b']]
etc...
或者,您可以使用正则表达式来构建函数!
select <- function(object, x) {
index <- grep(x, names(object))
return(object[[index]])
}
希望这有帮助!
你甚至不需要grep
。如果您尝试例如:select(l, "f")
,上面的函数将导致错误,因为以这种方式修改函数只会返回一个NULL,您可以使用is.null(.)
检查:
select <- function(object, x) {
return(object[[x]])
}
select(l, "a")
# [1] 1 2 3 4 5 6 7 8 9 10
select(l, "f")
# NULL