2012-02-26 11 views
13

get()を使用してrのリスト要素にアクセスしようとしていますが、エラーが発生しています。 ( "example.list $属性")GETでget()を使用してr内のリスト要素にアクセスする

example.list <- list() 
example.list$attribute <- c("test") 
get("example.list") # Works just fine 
get("example.list$attribute") # breaks 

エラー: オブジェクトのexample.list $属性は「

任意のヒントを見つけていませんか?リスト名を識別する文字列のベクトルをループしています。これは本当に便利です。

+1

エラーが発生する理由は、 'example.list $ attribute'はオブジェクトではありませんが、演算子を適用した結果です(' $ '、別名Extract、try - '? '" backtick " '$' "backtick)を'(example.list、attribute) 'に設定します。 – Ryogi

答えて

20

ここでは、おそらく探しているおまじないです:あなたの文字列がちょうど例えば、オブジェクト名以上が含まれている場合は

get("attribute", eval(as.symbol("example.list"))) 
# [1] "test" 

# Applied to your situation, as I understand it... 

example.list2 <- example.list 
listNames <- c("example.list", "example.list2") 
sapply(listNames, function(X) get("attribute", eval(as.symbol(X)))) 
# example.list example.list2 
#  "test"  "test" 
+0

最初の例は私のために働く1つの例です、それを行う最も唯一の方法ですか?私はmylist [1] [1]またはmylist [[1]] $ elementnameによってのみアクセスできます。 –

2

get("attribute", example.list) 
# [1] "test" 

それとも、自分の状況に、これはあなたの文字列がタイプ「オブジェクト$属性」の全てであれば

> string <- "example.list$attribute" 
> eval(parse(text = string)) 
[1] "test" 

、あなたはまた、オブジェクト/属性にそれらを解析することができるようにあなたはまだgetことができ、次のようにここのような演算子は、次の式のようにそれらを評価することができますオブジェクトは、その後、[[で属性を抽出します。

> parsed <- unlist(strsplit(string, "\\$")) 
> get(parsed[1])[[parsed[2]]] 
[1] "test" 
3

なぜ単純ではない:

example.list <- list(attribute="test") 
listName <- "example.list" 
get(listName)$attribute 

# or, if both the list name and the element name are given as arguments: 
elementName <- "attribute" 
get(listName)[[elementName]] 
-2

flodelの答えは自分のアプリケーションのために働いていたので、私はつもりポストワットです帽子私はそれにもかかわらず、これはかなりインスパイアされていません。あなたはそうのように、forループで各リストの要素にアクセスすることができます。

#============== List with five elements of non-uniform length ================# 
example.list= 
list(letters[1:5], letters[6:10], letters[11:15], letters[16:20], letters[21:26]) 
#===============================================================================# 
#====== for loop that names and concatenates each consecutive element ========# 
derp=c();   for(i in 1:length(example.list)) 
{derp=append(derp,eval(parse(text=example.list[i])))} 
derp #Not a particularly useful application here, but it proves the point. 

私は、列名によってデータフレームから列の特定のセットを呼び出す関数のために、このようなコードを使用しています。ユーザーは、それぞれが異なるセットの列名(各セットは1つのメジャーに属する項目のグループ)を表す要素と、それらの列をすべて含む大きなデータ・フレームをリストに入力します。 forループは、連続する各リスト要素を、内部関数の列名のセットとして適用します。*は、ビッグデータフレームの現在の名前付き列のセットにのみ適用されます。次に、行列の1ループにつき1つの列に、そのループの番号に対応するリストの要素内の名前に対応する大き​​なデータフレームのサブセットの出力を挿入します。 forループの後、生成された行列を出力することで関数は終了します。

あなたのリストの要素と似たようなことをしたいのかどうかはわかりませんが、私はこのトリックを拾いました。みんなのおかげでアイデアを!得点段階的応答モデルファクター内のアプリケーションに関する

「第二の例」/接線情報:

ここで私は、上記の機能は、誰もが段階的応答モデルの因子得点を計算したいだけの場合には、だ*大でバッチ...出力マトリックスの各列は、リストの要素(すなわち、リスト要素内の列名によって指定された順序指標項目を有する潜在特性)に対応し、行は、以下のように使用されるデータフレームの行に対応する。入力。各列は、おそらく、所与の個体からのように、出力行列の同じ行の因子スコアが属する、相互に依存する観測値を含むべきである。また、あるリスト要素のすべてのアイテムが同じリッカートスケール評価オプションを使用している場合は、評定スケールモデル(参照:http://www.rasch.org/rmt/rmt143k.htm)よりも、評点スコアリングに適さない可能性があります。

'grmscores'=function(ColumnNameList,DataFrame) {require(ltm) #(Rizopoulos,2006) 
x = matrix (NA , nrow = nrow (DataFrame), ncol = length (ColumnNameList)) 
for(i in 1:length(ColumnNameList)) #flodel's magic featured below!# 
{x[,i]=factor.scores(grm(DataFrame[, eval(parse(text= ColumnNameList[i]))]), 
resp.patterns=DataFrame[,eval(parse(text= ColumnNameList[i]))])$score.dat$z1}; x} 

リファレンス

* Rizopoulos、D.(2006)。 ltm:潜在変数モデリングと商品応答理論分析のためのRパッケージ、統計ソフトウェアのジャーナル、17(5)、1-25。 URL:http://www.jstatsoft.org/v17/i05/

+1

downvotesコメントなし? – flies