2017-07-13 28 views
0

以下は、返された関数にパラメータを渡すように設計された例です。私は返された関数をparamを2に評価させたいと思います。実際、それは何ですか?パラメータが渡された関数を返すとき、パラメータはどのように格納されますか?

ただし、これはどのように機能しますか?関数を印刷すると、「2」ではなく「param」と表示されます。 I debug()、私はparamは実際にparam 2.

f <- function(x, param = 2) {  
    my_cdf <- ecdf(x)  
    function(new_x) { 
     my_cdf(new_x) * param 
    } 
} 

g <- f(1:10) 
g 

# > function(new_x) { 
# > my_cdf(new_x) * param 
# > } 

答えて

1

であることを確認しては、それが使用されている関数で定義されていない場合でも、paramは、それを使用する関数だったwihchで環境に検索されますはその環境でとparam = 2と定義されています。これをレキシカルスコープと呼びます。

あなたはparamは、実際にこのようなsubstituteを試してみてください、関数に代入したい場合:

f <- function(x, param = 2) {  
    my_cdf <- ecdf(x) 
    F <- function(new, x) 
     my_cdf(new_x) * param 
    body(F) <- do.call("substitute", list(body(F), list(param = param))) 
    F 
} 
f(1:10) 
+0

私が返される関数を示すことによって、私の質問に補正をしたが、あなたはまだ適用さ答えます。私はもともと$ param $を評価しようとしました。その結果、$ g $を調べると代わりに2が表示されるようになりました。すべてが機能しているので、この時点ではもっと問題になります。 – brandonat

+0

OK。実際に 'param'を'の代わりに使う例を追加しました。 –

0

このchapter高度なRから何が起こっているかについて、より詳細を持っています。

その章からいくつかの例:

as.list(environment(g)) 

# $my_cdf 
# Empirical CDF 
# Call: ecdf(x) 
# x[1:10] =  1,  2,  3, ...,  9,  10 
# 
# $x 
# [1] 1 2 3 4 5 6 7 8 9 10 
# 
# $param 
# [1] 2 

library(pryr) 
unenclose(g) 

# function (new_x) 
# { 
#  (function (v) 
#  .approxfun(x, y, v, method, yleft, yright, f))(new_x) * 2 
# } 
関連する問題