1. ホーム
  2. r

[解決済み】Rのリストにオブジェクトを追加する償却定数時間、O(1)?

2022-04-01 15:43:07

質問

Rリストがある場合 mylist であれば、項目を追加することができます。 obj のようになります。

mylist[[length(mylist)+1]] <- obj

しかし、もっとコンパクトな方法があるはずだ。 私がRを使い始めたばかりの頃、次のように書いてみたことがあります。 lappend() というように。

lappend <- function(lst, obj) {
    lst[[length(lst)+1]] <- obj
    return(lst)
}

が、当然ながら R の call-by-name セマンティックスのためにうまくいきません ( lst は呼び出し時に事実上コピーされるので lst のスコープ外では見えません。 lappend() . R関数で環境ハッキングをして、関数のスコープ外に到達して呼び出し環境を変異させることができるのは知っていますが、それは単純なappend関数を書くための大きなハンマーのように思えます。

どなたか、もっと美しい方法をご提案いただけないでしょうか?もしそれがベクトルとリストの両方で動作するならば、ボーナスポイントです。

どのように解決するのですか?

文字列のリストであれば、単に c() 関数を使用します。

R> LL <- list(a="tom", b="dick")
R> c(LL, c="harry")
$a
[1] "tom"

$b
[1] "dick"

$c
[1] "harry"

R> class(LL)
[1] "list"
R> 

ベクターでも使えるから、ボーナスポイントもらえるかな?

編集(2015-2-01)しました。 この記事は5回目の誕生日を迎えようとしています。 いくつかの親切な読者はそれで任意の欠点を繰り返しているので、是非、以下のコメントの一部も参照してください。に対する一つの提案 list の型があります。

newlist <- list(oldlist, list(someobj))

一般に、Rの型は、すべての型と用途に対して1つだけのイディオムを持つことを難しくしていることがあります。