2016-08-17 10 views
1

私の質問はこれが可能かどうかです。与えられたリストbase :: ::()内の名前のないリスト要素へのアクセス

lst <- list(a = 1, 2) 

with(lst, a)は最初の要素を返すことができます。しかし、最初に名前を付けずにwithを使用して2番目の要素を返すことはできますか?

は動作しません:

with(lst, [[2]]) 
with(lst, `2`) 
with(lst, ..2) 

私はwith(lst, ls(all.names = TRUE))がちょうど"a"を与えるので、これが不可能であると思われます。しかし誰もが異なって知っていますか?

私はなぜwith(lst, 2)がうまくいかないかを知ります。もちろん、[[は関数なので、私の最初の試みはRを混乱させることは明らかです。しかし、withは名前のない引数に特別な名前を付けて、別々にリストに再アクセスせずにアクセスできるようになります。たとえば、withによって設定された環境では、2番目の要素は..2と呼びます。しかし、そうではありません。

この例では、単純にlst[[2]]を使用します。しかし、私は、いくつかの要素が命名され、他の要素が命名されていない、大規模な複数レベルのリストの複雑な表現に関して考えています。便利なレベルのサブセットから開始するには、withステートメントを使用して、コードをはるかに読みやすくすることができます。しかし、いくつかの必要な要素を無名にすることは、このための障壁です。

+0

この例ではまあまあです。これが役に立つときの文脈は、いくつかの名前付き要素といくつかの名前のない要素を含む複雑な式を使用して、複数レベルのリストの内部にいる場合です。考え方は、コードに必要なテキストの量を減らすことです。 – Bazz

+0

@akrun私は、最も簡単な再現可能な例を提供しました。いつものようにコーディングでは、もっとも簡単な例で複雑なコードを扱う理由を示しませんが、より複雑なコードに適用できる原則を示しています。 – Bazz

+2

最も簡単な問題への答えは、一般的にコードを気にして、そろばんを出すことではありません。 – Bazz

答えて

2

いいえ、これはできません。リスト内から名前のないオブジェクトを参照することはできません。

lst <- list(a = 1, 2) 

これはwithが何をするかです:lst内からアクセス

eval(substitute(a), lst, enclos = parent.frame()) 
#[1] 1 

唯一のオブジェクトはaです:

eval(substitute(ls()), lst, enclos = parent.frame()) 
#[1] "a" 

私は、リストのすべてのコンポーネントに名前を付けることをお勧めしたいです。 (そして、正直言って、私は普通のユースケースは実際には見ません。)

関連する問題