Создание одной функции на основе нескольких других функций с другим параметром - PullRequest
0 голосов
/ 07 марта 2019

У меня есть две функции с разными параметрами, скажем, функция 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, 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, h, либо i.

Ответы [ 3 ]

2 голосов
/ 07 марта 2019

Создайте функцию 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
0 голосов
/ 07 марта 2019

Не уверен, что я хорошо прицелился, но мы могли бы использовать:

Edit:

Прочитав об опасностях eval(parse()) благодаря @Maurits Evers, мы могли бы использовать 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)
0 голосов
/ 07 марта 2019

Что если вы просто поместите f и g внутри m? Будет ли это работать? У меня нет 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()

}
...