5

my_function(i,x) ( i1 から 25 までの整数) の追加の名前を作成する必要があります。私はそれがこのように動作することを望みます

  • my_function1(x) my_function(1,x) と同じ
  • my_function2(x) my_function(2,x) と同じ
  • my_function3(x) my_function(3,x) と同じ
  • ...
  • my_function25(x) my_function(25,x) と同じ

これを達成する1つの方法は次のとおりです。

my_function1 <- function (x) my_function(1, x)
my_function2 <- function (x) my_function(2, x)
my_function3 <- function (x) my_function(3, x)
...

しかし、それらは 25 個あるので、ループにするのが合理的です。このために私は試しました:

for(i in 1:25){
  assign(paste("my_function",i,sep=""),function(x) my_function(i,x))
}

しかしi、参照によって渡され、最終的に結果が

  • my_function1(x) my_function(25,x) と同じ
  • my_function2(x) my_function(25,x) と同じ
  • my_function3(x) my_function(25,x) と同じ
  • ...

「i」を値で渡すにはどうすればよいですか? それとも何か別の方法があるのでしょうか...

なぜ私はこれをしたいのですか?私は効率の面で他の誰かのRパッケージを改善していますが、同時に古いバージョンとの互換性が必要です。

4

3 に答える 3

6

これはカリー化と呼ばれ、関数型プログラミングの一部です。

library(functional)

myf <- function(a,x) cat(a,x,"\n")
myf1 <- Curry(myf, a=1)
myf1(5)
for(i in seq(25)) assign(paste0("myf",i), Curry(myf,a=i) )
> myf15(5)
15 5

なぜこれをやりたいのかという重要な質問がここにあると思います。これは、関連する関数があまりない引数が必要な場合とまったく同じように思えます。

于 2013-05-05T12:12:32.890 に答える
4

base関数を使用しても同じ結果を得ることができます。

force秘訣は、各反復での評価を強制 ( ) し、 (または好きな環境で)i関数を割り当てることです。.Globalenv

my_function <- function(a, b) a + b


lapply(1:10, function(i) {
    force(i)
    assign(paste0("my_function", i), function(x) my_function(i, x), envir = .GlobalEnv)
}
       )


my_function1(10)
## [1] 11

my_function9(10)
## [1] 19
于 2013-05-05T13:11:00.573 に答える
2

bquoteここで役立つと思います:

for(i in 1:2){
  assign(paste("my_function",i,sep=""), bquote( function(x) my_function( i = .(i) , x ) ) )
}

>my_function2
# function(x) my_function(i = 2L, x)

しかし、要点は変わりません。なぜこれを行う必要があるのでしょう

于 2013-05-05T13:07:47.667 に答える