如何根据函数中的名称选择列表元素?

时间:2013-05-10 17:38:22

标签: r get

考虑这个清单:

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以使其工作但代码少于上面的代码?

1 个答案:

答案 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