【问题标题】:How to get match.call() from a united function?如何从联合函数中获取 match.call()?
【发布时间】:2019-08-07 07:51:59
【问题描述】:

我有三个函数,一个函数是使用 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")
}

但它不起作用。谁能给我一个提示如何解决我的问题?

【问题讨论】:

  • 你的参数不匹配,方法参数必须匹配通用参数
  • 而不是out列表使用on.exit函数结合returnValue
  • 工作示例,我用它来捕获返回值的nrow,但我也将match.call 保留在那里:github.com/jangorecki/dtq/blob/…
  • 如果你想去掉.numeric后缀,只需修改语言对象substras.name
  • 如果您设法使其工作,请自行回答您的问题,因为可能其他人也有同样的问题。我没有发布答案,因为我正在打电话。

标签: r function output call


【解决方案1】:

这是另一种方式:

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 一起使用。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 当我运行你的代码时,结果只是向量本身。我不知道为什么,但调用没有存储在结果中。
    • 启动一个全新的 R 普通会话,将答案中的代码复制并粘贴到 R 中,您应该能够重现显示的结果。我在 Windows 和 Linux 上都试过了,效果如图所示。
    • 我在新的会话中重复了它,它对我有用。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    相关资源
    最近更新 更多