基于具有不同参数的多个其他功能创建一个功能

时间:2019-03-07 02:53:37

标签: r function loops

我有两个具有不同参数的函数,比如说函数f和函数g

f <- function(a1, a2, a3, a4, a5) {  
      w <- a1+a2+a3+a4+a5 
}

g <- function(x, y) { 
      z <- w*x*y 
      print(z)
}

我正在尝试将这两个功能合并为一个,并且我能想到的是这样做的:

m <- function(a1,a2,a3,a4,a5,x,y) {
        w <- a1+a2+a3+a4+a5
        z <- w*x*y
        print(z) 
}

函数m的问题在于,由于参数过多,我觉得它太乱了。

  

我的目标是创建一个函数,该函数将首先通过f,然后通过g,最后打印答案。

我要这样做的原因是,在我的代码中几乎有3到5个函数(假设ghi,{{1} },j)都使用不同的参数。但是,这些功能将首先经历主要功能(功能k),然后执行fghi中的任何一个, j,基于用户的输入。我有使用循环的想法,但是我不知道要应用哪个循环。

例如,我还有另一个功能kh

i

我想做的就是从所有这些函数创建一个函数(也许使用循环)。函数h <- function(b,c) { t <- w*b/c print(z) } i <- function(d, e) { v <- w+d*e print(z) } 是主要函数(这意味着这是要执行的第一件事),然后根据用户输入,它将执行函数fg或{{ 1}}。

3 个答案:

答案 0 :(得分:2)

创建一个函数main,该函数接受gxyf参数。 f参数将通过...传递。现在,由于g引用了w中未定义的g,因此它将g放在w的词汇双亲中,因此g必须在f内定义,否则我们必须将g的环境重置为f内的环境,以便在运行w时可以找到g。我们做后者。

如果可以重新定义g以便通过参数将w显式传递给它,那么我们可以删除重置g环境的行,并将调用修改为gw添加到参数列表中。

f <- function(a1, a2, a3, a4, a5) {  
      w <- a1+a2+a3+a4+a5 
}

g <- function(x, y) { 
      z <- w*x*y 
      print(z)
}

h <- function(b,c) { 
      t <- w*b/c 
      print(t)
}

i <- function(d, e) { 
      v <- w+d*e 
      print(v)
}

main <- function(FUN, x, y, ...) {
  environment(FUN) <- environment()
  w <- f(...)
  FUN(x, y)
}

# tests
a1 <- a2 <- a3 <- a4 <- a5 <- x <- y <- 1

main(g, x, y, a1, a2, a3, a4, a5)
## [1] 5

main(h, x, y, a1, a2, a3, a4, a5)
## [1] 5

main(i, x, y, a1, a2, a3, a4, a5)
## [1] 6

答案 1 :(得分:0)

不确定我的目标是否很好,但是我们可以使用:

编辑:

感谢@Maurits Evers了解了eval(parse())的危险之后,我们可以改用get

 combfn1<-function(x,y,func,...){
      w<-do.call(get(func),list(c(...)))
      z<-w*x*y
      print(z)
    }
   combfn1(1,2,"sum",3,4,6)

以下几篇文章已经回答了以下功能的危险,其中之一是this

 combfn<-function(x,y,func,...){
      w<-do.call(eval(parse(text=quote(func))),list(c(...)))
      z<-w*x*y
      print(z)
    }
    combfn(1,2,"sum",3,4)

答案 2 :(得分:-2)

如果仅将f和g放在m里面怎么办?这行得通吗?我在atm前面没有R。

m <- function(f, g) {


f <- function(a1, a2, a3, a4, a5) {  
      w <- a1+a2+a3+a4+a5 
}

g <- function(x, y) { 
      z <- w*x*y 
      print(z)
}
f()
g()

}