Подтвердить что ты не робот

Доступ ко всем аргументам функции в R

У меня есть функция 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);

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

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);

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

4b9b3361

Ответ 1

Что-то вроде этого, конечно, возможно. Вы должны просто представить себе для себя, в каком фрейме/точке вы хотите оценить аргументы 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())
}