2011-12-05 8 views
10

名前付きのパラメータを持つ関数f()があります。それは関数g()を呼び出し、すべてのfのパラメータを渡したいと思います。これは可能ですか?それらの値をすべての関数引数にアクセスするR

f=function(a,callback,b,c,d,...){ 
    z=a-b 
    callback(z,...) 
    } 

g=function(z,...){ 
    print(list(...)) #Only shows $e 
    print(z) #-1 
    print(a,b,c,d) #'a' not found 
} 

f(1,g,2,3,d=4,e=5); 

は、私は()ホルマールを考えた答えだったが、単に引数名のようです、ではない:

使用して...ちょうど余分な引数をカバー!

f=function(a,callback,b,c,d,...){ 
    z=a-b 
    callback(z,formals()) 
    } 

g=function(z,...){ 
    args=list(...)[[1]] 
    print(args$a) #(no output) 
    print(class(args$a)) #"name" 
} 

f(1,g,2,3,d=4,e=5); 

可能ですか?ありがとう。

+1

は、これがどのように行われるかを確認するlm'と '' glm'のコードを見てください。 –

+0

@HongOoiありがとう;それはmatch.callで行われます(つまり、Antonの答えと同じですが).IIUCはすべての引数ではなく、特定の引数を渡すことを選択します。 –

答えて

15

これは確かに可能です。どのフレーム/ポイントであなたがfの引数を評価したいのかを把握して、gに転送します。

典型的な手順は、fで呼び出された呼び出し式を実際に記録するためにmatch.call()を呼び出すことです。呼び出し式を都合のよいように変更します(たとえば不要な引数を取り除き、等)を呼び出し、eval()呼び出しを介して新しい呼び出し式を評価します。だから、このはず(ほぼ)仕事のようなもの:

f <- function(a, callback, b, c, d, ...) { 
    # Grab the "f" call expression 
    fcall <- match.call(expand.dots = FALSE) 

    # Construct the new call expression 
    fcall[[1]] <- callback 
    # Filter out/add new args 
    fcall$callback <- NULL 
    fcall$z <- z 

    # Do the call 
    eval(fcall, parent.frame()) 
} 
+0

または、余分な引数を渡すことができます。はるかに理解しやすい。 – hadley

+0

@hadleyはい、ただし、引数リストが変更されても維持するのは難しいです。すべての選択肢を考慮した後、私の実際のコードでは、他のすべての引数を含む名前付きリスト引数に行きました。私。 _リファクタリング専門用語のParameter Object_をご紹介します。だから私はf()に1つの引数を渡すだけで、同じ引数がg()に与えられます。 –

+0

私のためにエラーを投げます。 –

関連する問題