3

値が変数として扱われる場合と、R で文字列として扱われる場合とで混乱しています。Ruby と Python では、文字列を常に引用符で囲む必要があり、引用符で囲まれていない文字列は常に変数として扱われることに慣れています。 . すなわち。

a["hello"] => a["hello"]
b = "hi"
a[b] => a["hi"]

しかし、R では、これは当てはまりません。たとえば、

a$b < c(1,2,3)

b ここでは、変数 b ではなく、列の値/名前です。

c <- "b"
a$c => column not found (it's looking for column c, not b, which is the value of the variable c)

(この特定のケースでは a[c] を使用できることはわかっていますが、他にも多くのケースがあります。たとえばggplot(a, aes(x=c))、c という名前ではなく、c の値である列をプロットしたい)...

他の StackOverflow の質問では、引用、代用などの言及を見てきました。

私の質問は次のとおりです。変数を「展開」し、変数の名前の代わりに変数の値が使用されるようにする一般的な方法はありますか? それとも、それはRでのやり方ではないのでしょうか?

4

5 に答える 5

3

オペレーターに関して投稿したものが機能しない理由は非常に微妙であり、一般に、その目的のために設計された$ような関数を使用できるRの他のほとんどの状況とはまったく異なります。getただし、呼び出しa$bは呼び出しと同等です

`$`(a , b)

これは、R ではすべてがオブジェクトであることを思い出させてくれます。$は関数であり、2 つの引数を取ります。ソース コードを確認するとa$c、R を呼び出して評価cする"b"ことを期待しても機能しないことがわかります。これは、ソース コードに次のように記載されているためです。

/* The $ subset operator.  
   We need to be sure to only evaluate the first argument.  
   The second will be a symbol that needs to be matched, not evaluated.  
*/

以下を使用してこれを実現します。

if(isSymbol(nlist) )
SET_STRING_ELT(input, 0, PRINTNAME(nlist));
else if(isString(nlist) )
SET_STRING_ELT(input, 0, STRING_ELT(nlist, 0));
else {
errorcall(call,_("invalid subscript type '%s'"),
      type2char(TYPEOF(nlist)));
}

nlistは、渡した引数(マップされるdo_subset_3C 関数の名前) です。この場合は. がシンボルであることがわかったので、文字列に置き換えますが、評価はしません。文字列の場合は、文字列として渡されます。$cc

于 2013-05-10T15:54:52.737 に答える
2

ここに、R での評価の「なぜ」と「いつ」を理解するのに役立つリンクをいくつか示します。それらは啓発的であるかもしれませんし、助けになるかもしれません。

http://developer.r-project.org/nonstandard-eval.pdf

http://journal.r-project.org/2009-1/RJournal_2009-1_Chambers.pdf

http://www.burns-stat.com/documents/presentations/inferno-ish-r/

最後の 1 つで最も重要な部分は箇条書き 2 です。次に、一連のスライド全体を読みます。私はおそらく3番目のものから始めて、最初の2番目のもの.

これらは、特定のケースを機能させる方法の精神ではなく(他の回答が行ったように)、この状況につながった理由と、場合によっては標準的で非標準的な方法を使用することが理にかなっている理由です。変数へのアクセス。うまくいけば、その理由と時期を理解することで、全体的な何をすべきかがわかります。

于 2013-05-10T19:58:29.057 に答える
0

「b」という名前の変数を取得する場合は、すべての場合に get 関数を使用します。これにより、b が見つかった場合は get(b) の値が置き換えられます。

于 2013-05-10T15:41:47.293 に答える