1

考虑这个列表:

l <- list(a=1:10,b=1:10,c=rep(0,10),d=11:20)

然后考虑这个示例代码(代表真正的较大代码)。它只是根据名称在列表中选择正确的元素。

参数:

对象:最多包含四个元素的列表(即,有时少于四个)。元素始终称为 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 个元素,而是数百个元素时,这种方法变得不切实际。此外,我无法根据数字进行选择(例如,object[[1]]),因为元素每次的顺序不同。那么我怎样才能使上面的代码更短呢?

我在考虑 SAS 中的宏观方法,但当然这在 R 中不起作用。

slct <- function(object,x) {

  object$x
}
object$a

slct(object=l,x="a")

我必须用什么替换 object$x 才能使其工作,但代码比上面的代码少?

4

1 回答 1

8

只需使用双括号引用列表中的元素。

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
于 2013-05-10T17:41:06.997 回答