Как получить match.call () из объединенной функции? - PullRequest
4 голосов
/ 16 марта 2019

У меня есть три функции, и одна функция сделана из двух других с помощью useMethod ().

logReg <- function(x, ...) UseMethod("logReg")
logRec.numeric <- function(x, y) {
  print(x)
}
logReg.formula <- function(formula, data) {
  print(formula)
}

Мои функции немного сложнее, но это не имеет значения для моего вопроса.Я хочу, чтобы logReg дополнительно выдавал мне исходный вызов функции в качестве вывода (а не вызов функции logReg.numeric oder logReg.formula).Моя первая попытка была:

logReg <- function(x, ...) {
  out <- list()
  out$call <- match.call()
  out
  UseMethod("logReg")
}

Но это не работает.Может кто-нибудь подсказать, как решить мою проблему?

Ответы [ 2 ]

1 голос
/ 18 марта 2019

Вот еще один способ:

logReg <- function(x, ...) {
  logReg <- function(x, ...) UseMethod("logReg")
  list(logReg(x,...), call=match.call())
}

res <- logReg(1,2)
# [1] 1

res
# [[1]]
# [1] 1
# 
# $call
# logReg(x = 1, 2)
# 

Вы можете также заставить его работать с atttibutes.

1 голос
/ 16 марта 2019

Попробуйте оценить это явно. Обратите внимание, что это сохраняет вызывающую сторону в качестве родительского фрейма метода.

logReg <- function(x, ...) {
  cl <- mc <- match.call()
  cl[[1]] <- as.name("logReg0")
  out <- structure(eval.parent(cl), call = mc)
  out
}

logReg0 <- function(x, ...) UseMethod("logReg0")
logReg0.numeric <- function(x, ...) print(x)
logReg0.formula <- function(x, ...) print(x)

result <- logReg(c(1,2))
## [1] 1 2

result
## [1] 1 2
## attr(,"call")
## logReg(x = c(1, 2))
...