2017-08-30 9 views
1

TL; DR:必要なものはlist()のベクトル化されたバージョンです。オブジェクト名のベクトルから多くのオブジェクトのリストを作成する

私はオブジェクトのリストを作成しようとしています。どれくらいのオブジェクトがあるのか​​、何が呼び出されるのか分かりませんし、それらのオブジェクトが多数あるかもしれません。だから私は手でリストを作ることはできない。

しかし、私はリストを作る時間が来たときに、すべてのオブジェクトが私の環境に存在することを知っています。そして、私はすべてのオブジェクトの名前を含む文字ベクトルを持っていることを知っています。

(これは、私がもっと大きくするのを避けようとしている恐ろしい3層ループの出力です。空のリストを作成してループを作成するときにオブジェクトを割り当てるだけで、私はGoogleとStack Overflowを検索しましたが、良い解決策が見つかりませんでした。私に必要なのは、list()のベクター化されたバージョンです:オブジェクト名のベクトルをとり、それらのオブジェクトをすべて見つけてリストに入れてしまうもの。

list(obj1, obj2, obj3) # Not this. I don't want to name each element individually. 

objectsVector <- c("obj1", "obj2", "obj3") 
list_vectorised(elements = objectsVector) # I want this instead. 

namesVector <- c("anObject", "anotherObject", "yetAnotherObject") 
list_vectorised(elements = objectsVector, names = namesVector) # Or better still, this. 
+3

'mget(namesVector)' –

+0

ありがとう! mgetの使用は、lapply-ing getよりもはるかに優れています。 –

+0

リンク先の記事で私の答えを見てください。 'ls'のパターン引数とともに' mget'を使って、特定のパターンに名前が一致するオブジェクトをプルします。リンクされた投稿はdata.framesについて尋ねますが、すべての回答はあらゆるタイプのRオブジェクトに対して機能します。 – lmo

答えて

2

あなたは環境からオブジェクトを取得し、リストにそれらを置くためにmgetを使用することができます。

mget(VECTOR_OF_NAMES_OF_OBJECTS) 

あなたがオブジェクト名あなたの自己を入力する必要がないように、また、ls()mgetを組み合わせることができます。

obj1 = 1:2 
obj2 = 3:7 
obj13 = 8:11 

mget(ls(pattern = "obj\\d+")) 
#$obj1 
#[1] 1 2 

#$obj13 
#[1] 8 9 10 11 

#$obj2 
#[1] 3 4 5 6 7 
+0

それは私の問題を解決しないでしょう、私は恐れています。オブジェクトは実際にobj1、ob2などと呼ばれることはなく、動的な名前を持ちます。 しかし、私はmgetが存在し、ls()が正規表現をとることができることを知ってうれしいです。 mgetは私の解決策より優れています。ありがとう! –

0

解決策が見つかりました。

foo <- lapply(objectsVector, get) # This creates a list of the objects. 
foo <- setnames(foo, namesVector) # This names the elements of the list. 

私は長い間、答えを探していて、他の人にトラブルを抱かせたいので、質問を残しています。それが承認されたものかどうかはわかりません。

関連する問題