我有两个具有不同参数的函数,比如说函数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个函数(假设g
,h
,i
,{{1} },j
)都使用不同的参数。但是,这些功能将首先经历主要功能(功能k
),然后执行f
,g
,h
,i
中的任何一个, j
,基于用户的输入。我有使用循环的想法,但是我不知道要应用哪个循环。
例如,我还有另一个功能k
和h
:
i
我想做的就是从所有这些函数创建一个函数(也许使用循环)。函数h <- function(b,c) {
t <- w*b/c
print(z)
}
i <- function(d, e) {
v <- w+d*e
print(z)
}
是主要函数(这意味着这是要执行的第一件事),然后根据用户输入,它将执行函数f
,g
或{{ 1}}。
答案 0 :(得分:2)
创建一个函数main
,该函数接受g
,x
,y
和f
参数。 f
参数将通过...
传递。现在,由于g
引用了w
中未定义的g
,因此它将g
放在w
的词汇双亲中,因此g
必须在f
内定义,否则我们必须将g
的环境重置为f
内的环境,以便在运行w
时可以找到g
。我们做后者。
如果可以重新定义g
以便通过参数将w
显式传递给它,那么我们可以删除重置g
环境的行,并将调用修改为g
将w
添加到参数列表中。
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()
}