如何从联合函数中获取match.call()?

时间:2019-03-16 11:06:46

标签: r function output call

我有3个功能,而其中一个功能是通过使用useMethod()从另外两个功能中选出的。

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

我的功能稍微复杂一点,但对我的问题并不重要。我希望logReg额外给我原始函数调用作为输出(而不是logReg.numeric或logReg.formula的函数调用)。我的第一次尝试是:

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

但是它不起作用。有人可以给我提示如何解决我的问题吗?

2 个答案:

答案 0 :(得分:1)

尝试明确评估它。请注意,这会将调用方保留为该方法的父框架。

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

答案 1 :(得分:1)

Here's another way :

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

You can make it work with atttibutes too if you prefer.