1

次のリストを検討してください。

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

次に、このコード例を検討してください (実際のより大きなコードの代表)。名前に基づいてリスト内の適切な要素を選択するだけです。

パラメーター:

オブジェクト: 最大 4 つの要素 (つまり、4 つ未満の場合もあります) を持つリスト。要素は常に 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 に答える