9

いくつかの統計モデルの結果をワークスペースに保存する一連のオブジェクトがあります。それらを「model1」、「model2」などと呼びます。これらの各モデルには、たとえば$coefなどの同じ名前付き要素のセットが付加されています。文字列「model」を含むすべてのオブジェクトから、特定の要素に格納されている値をリストまたはベクトルに抽出したいと思います。

コマンドラインで入力された次のコードは、私が望むことを実行します。

unlist(lapply(parse(text = paste0(ls()[grep("model", ls() )], "$", "coef")), eval))

これから、次のジェネリック関数を作成しました。

get.elements <- function(object, element) {
    unlist(lapply(parse(text = paste0(ls()[grep(object, ls() )], "$", element)), eval))
}

ただし、この関数を実行すると、次のエラーが発生します。

Error in parse(text = paste0(ls()[grep(object, ls() )], "$", element)) : 
  <text>:1:1: unexpected '$'
1: $
   ^

Q1。このコードをコマンドラインから実行すると機能するが、関数としては機能しないのはなぜですか。さらに重要なのは、このコードを修正するにはどうすればよいですか。

Q2。さらに良いことに、同じことを達成するより簡単な方法はありますか?これは、統計家やシミュレーションモデラーにとって非常に一般的なタスクのように思われるため、基本パッケージに何らかのコマンドが含まれていると思いますが、何も見つかりませんでした。確かに、これを行うには、私の面倒な方法よりもエレガントな方法があるはずです。

すべての助けをありがとう。

-デイブ

4

3 に答える 3

13

ls()Q1)関数の環境を見て、そこに一致するオブジェクトがないため、コードが失敗します。

paste0(ls()[grep(object, ls() )], "$", element)

と同等です

paste0("$", element)

ls()ワークスペースを確認するには、ls(pos = 1).

Q2) これは一般的なタスクですが、モデルがどこにあるのか、何と呼ばれているのか、どのオブジェクトを抽出したいのか、どのように返してほしいのかは要件によって異なるため、知る限りこれを行う関数はありません。 . 上記で提案したものの少しきれいなバージョンは次のようになります

nm <- paste0("model", 1:2) # adjust numbers as required
unlist(lapply(nm, function(x) get(nm)$coef))

または、モデルをリストに入れて使用することもできます

modList <- list(model1, model2)
unlist(lapply(modList, "[[", "coefficients"))
于 2012-09-25T18:11:12.590 に答える
2

これは、目的の出力を取得する方法です。

get.elements <- function(object, element) {
 unlist(lapply(ls(pattern = object, .GlobalEnv),
        function(x) get(x, .GlobalEnv)[[element, exact = FALSE]]))
}

elementとはどちらobjectも文字列です。

exact = FALSE要素の名前coefficientsは ではなくであるため、引数 を使用したことに注意してくださいcoef。このように、引き続きご利用いただけますelement = "coef"

于 2012-09-25T18:03:32.343 に答える