2013-05-05 3 views
5

my_function (i, x)에 대한 추가 이름을 작성해야합니다 (여기서 i은 1 - 25의 정수일 수 있음). 나는 그것이 my_function으로이추가 함수 이름이지만 인수가 더 적음

  • my_function1 (x)는 같은 SAMES 일을하고 싶습니다 (1, x)는
  • my_function2 (x)는 my_function로 SAMES (2, x)는
  • my_function3 (x)의 SAMES my_function (3, x)는
  • ... my_function로
  • my_function25 (x)는 SAMES (25, x)를 달성 할 수

한 가지 방법이 될 것이다 :

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 개가 루프로 작성하는 것이 합리적입니다. X, 결과는 my_function (25로

  • my_function1 (x)의 SAMES이었다 참조하고 결국 통과

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

    을하지만 i 때문에 작동하지 않습니다이 들어 나는 시도했다)

  • my_function2 (X) my_function (25 SAMES, X)
  • my_function3 (X) my_function (25 SAMES, X)
  • ...
  • 0,123,516

값으로 "i"를 어떻게 전달할 수 있습니까? 아니면 다른 방법이있을 것입니다 ...

왜 내가 이것을하고 싶습니까? 효율성 측면에서 다른 사람의 R 패키지를 개선하고 있지만 동시에 이전 버전과 호환되도록해야합니다.

+0

에 오신 것을 환영합니다 SO를 각각의 반복에서 i의 평가 (force)를 강제하고 .Globalenv (당신이 좋아하는 또는 환경)에 기능을 할당하는 것입니다. 다음 번에 [재현 가능한 예] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)를 게시하면 더 나은 답변을 얻을 수 있습니다.또는이 시간, 이후 게시물을 편집 할 수 있습니다 :-) –

+0

@ AriB.Friedman 감사합니다 :) 다음 번에 나는 재현 가능한 예를 쓰는 것을 기억할 것입니다. 카레는 매우 깨끗해 보입니다. 그러나 완벽하게 작동합니다. 그러나이 경우에는 여분의 패키지를 설치하고 싶지 않으므로 표준 R 기능을 사용하고 싶습니다. – LukaszJ

답변

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 

나는 여기에 당신이 할 싶어 왜에 관한 중요한 질문이 같아요. 이것은 논쟁이 많은 관련 기능을 필요로하지 않는 것과 같은 것 같습니다. 내가 bquote 여기에 도움이 될 것입니다 생각

+0

+1 나는 카레에 대해 몰랐다. (아직도 나는 배울 것이 많다!). 감사. –

+0

@ SimonO101 더블린으로가는 길은 여러 곳이 있습니다. 'bquote'를 잘 사용하십시오. –

+0

그러나 위에 반환 한 구문 적으로 유효하지 않습니다! 나는 단지 질문에서 붙여 넣기 만했다. –

2

:

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) 

하지만 요점은 여전히 ​​유효 - 왜 이렇게 원하는 것?

+0

글쎄요, 효율면에서 다른 사람의 R 패키지를 향상시키고 있지만 동시에 이전 버전과 호환되도록해야합니다. 솔루션을 가져 주셔서 감사합니다! – LukaszJ

4

글쎄, base 기능을 사용하여 동일한 결과를 얻을 수 있습니다.

비결은

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 
+0

+1 멋진 솔루션입니다. –

+0

@ SimonO101 감사합니다 !!! 나는 R에서 철학을하는 "하나 이상의 방법이있다"는 것을 좋아한다. 나는 카레 (Curry)도 알지 못했고,이 경우에는 bquote에 대해서 생각하지 않았다. thks – dickoa

+2

할 방법은 여러 가지가 있지만 한 가지 방법 밖에 없습니다. 실제로는하지 말아야 할 일이라고 생각합니다. OP의 다음 질문은 "어떻게해야합니까? 'i'의 어떤 값에 대해서'my_function $ {i}()'를 호출합니까? – Spacedman

관련 문제