2017-02-22 12 views
1

以前postと未評価の関数呼び出しを作成すると、引数も未評価されている機能に未評価の呼び出しを作成するためにquote()を使用する方法を示しています。が評価されないが、変更の引数

foo <-function(arg1,arg2){ 
    value <- arg1 + arg2 
} 

foocall <- call("foo",arg1=quote(x),arg2=quote(y)) 
foocall 
# foo(arg1 = x, arg2 = y) 

どのように私は、この品質を保つことができますが、 arg1の指定を変更できるようにします。たとえば、私の環境では2つの名前付きオブジェクトnとmがあり、時には1つを渡したい場合があり、もう一方を渡したいことがあります。

## Named objects 
n <- c(2,3) 
m <- 3 

## Case 1: i would like to pass over n 
z <-n 
call("foo", arg1=quote(z), arg2=quote(y)) 

## desired output 
#foo(arg1 = n, arg2=y) 

## Case 2: pass over m 
z <- m 
call("foo", arg1=quote(z), arg2=quote(y)) 

## desired output 
#foo(arg1 = m, arg2=y) 

私はきちんと私の質問を策定するために苦労を持っているが、私はこのようにそれを述べるだろう:どのように変更することができ、変数をarg1がために割り当てることができますが、「すべての道をダウン」評価しませんが、それがバインドされているオブジェクトの名前にのみ適用されますか?あなたは

> z <- n 

を行うと

+1

私にはわかりません。どちらの場合も、呼び出しを 'eval'すると、定義したように' n'または 'm'の値が正しく使用されます。 (あなたの例は 'foo'が実際に' value'を返すならば、あなたの例はおそらくもっと簡単になります。) – joran

+0

私の主な目標は、評価するのではなく、文書化することです。実際はクラスlmのオブジェクトの$ call list- – laterstat

+0

ああ、「元の」シンボルに「アンラップ」されたすべてのシンボルが表示されます。 Hm。 – joran

答えて

2

右辺が評価され、そのシンボルzはないシンボルn自体、nが割り当てられます。

> z 
[1] 2 3 

今すぐzの値は、シンボル、すなわちシンボルnある

> z <- quote(n) 

と比較します。したがって

> z 
n 

今あなたが

> call('foo', arg1=z, arg2=quote(y)) 
foo(arg1 = n, arg2 = y) 

を行うことができますし、期待通りに動作します。

+0

ありがとうございます。しかし、これはちょうど1つのレベルの質問をプッシュします。このようにすれば、式に 'quote(n)'を直接挿入することができます。理想的には、quote()コールの中で変数を代入したいと思います。そうでなければ、もし100個のオブジェクトがn1からn100の場合、100個の割り当てをハードコーディングする必要があります。 'z < - quote(n1)' ... 'z <-quote(n100)' – laterstat

+0

はい、そうです。 'z'が形式的な引数でない限り、それを回避する方法はありません.Rの関数引数が特別な振る舞いをするからです。 –

関連する問題