2

R 言語では、関数 ff(jj, kk, mm) があるとします。呼び出し関数 (または対話型セッションでの人間の呼び出し) が、呼び出し時に mm を jj と kk に任意の方法で依存させることができるようにしたいと考えています。

具体的には、次のように仮定します。

ff <- function(jj, kk, mm){
  xx <- jj + kk  
  out<- xx/mm   
  out
}

次に、実行時に設定したいと思いmm <- jj*kkます。すなわち:

ff(2, 3, (jj*kk))

これにより、次の結果が得られます。

Error in ff(2, 3, (jj * kk)) : object 'jj' not found

このエラーは が評価されるまでスローされませんmm。つまり、jjkk正常に評価された後です。そのため、それらは異なるスコープ ルールで 2 回評価されます。これは R 標準のスコープであることを理解しています。私が尋ねているの mmは、必要な前にそれらの引数が評価されている、または評価できる場合に、単純な数値または他の仮引数の関数を渡すことができるような方法で関数を作成できるかどうかです。

これを行うべきかどうかを尋ねているわけではないことに注意してください。この後者の質問について意見を述べる人々に対して、私は断固として礼儀正しいふりをします。

また、jj を事前に計算して事前に消化した数値を渡すことができるかどうかも尋ねていません。これがもっともらしい答えであることは知っていますが、問題を単純化した理由からうまくいきません。

4

1 に答える 1

5

現状では、提供された引数が呼び出し元の環境のコンテキストで評価されるため、関数は機能ff()しません。jjkk

mm関数自体の評価フレームのコンテキスト内で に提供されたステートメントを評価するにはeval(substitute())、次のように を使用します。

ff <- function(jj, kk, mm){
  mm <- eval(substitute(mm))
  xx <- jj + kk  
  out<- xx/mm   
  out
}

ff(2, 3, (jj*kk))
## [1] 0.8333333
于 2014-07-11T07:05:32.900 に答える