Доступ ко всем аргументам функции в R - PullRequest
10 голосов
/ 05 декабря 2011

У меня есть функция f (), которая имеет некоторые именованные параметры. Он вызывает функцию g (), и я хочу передать ей все параметры f. Возможно ли это?

Использование ... просто покрывает дополнительные аргументы:

f=function(a,callback,b,c,d,...){
  z=a-b
  callback(z,...) 
  }

g=function(z,...){
  print(list(...))    #Only shows $e
  print(z)    #-1
  print(a,b,c,d)  #'a' not found   
}

f(1,g,2,3,d=4,e=5);

Я думал, что формал () был ответом, но это просто имена аргументов, а не их значения!

f=function(a,callback,b,c,d,...){
  z=a-b
  callback(z,formals()) 
  }

g=function(z,...){
  args=list(...)[[1]]
  print(args$a) #(no output)
  print(class(args$a))  #"name"
}

f(1,g,2,3,d=4,e=5);

Возможно ли это? Спасибо.

1 Ответ

15 голосов
/ 05 декабря 2011

Ну, как-то так, конечно, возможно. Вы должны просто выяснить для себя, в каком кадре / точке вы хотите оценить аргументы f, которые затем передаются в g.

Типичная процедура состоит из вызова match.call () внутри f для фактической записи выражения вызова, с которым был вызван f, с последующим изменением выражения вызова так, как вам удобно (например, отфильтровывание ненужных аргументов, добавление новых, и т.д.), а затем вычисление нового выражения вызова с помощью вызова eval (). Итак, что-то вроде этого должно (почти) работать:

f <- function(a, callback, b, c, d, ...) {
  # Grab the "f" call expression
  fcall <- match.call(expand.dots = FALSE)

  # Construct the new call expression
  fcall[[1]] <- callback
  # Filter out / add new args
  fcall$callback <- NULL
  fcall$z <- z

  # Do the call
  eval(fcall, parent.frame())
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...