【问题标题】:Substitute From Implicit `show` Call替换隐式`show`调用
【发布时间】:2013-12-28 20:59:41
【问题描述】:

我需要从 show 方法中恢复隐式用于调用 show 的表达式,但这仅适用于显式 show 调用:

> setClass("test", representation(a="character"))
> setMethod("show", "test", function(object) cat(deparse(substitute(object))))
[1] "show"
> show(new("test"))    # explicit call: as expected
new("test")
> new("test")          # implicit: not so much...
<S4 object of class structure("test", package = ".GlobalEnv")>

print 和 S3 对象似乎也有类似的问题,但我对这里的 S4 版本更感兴趣。有什么办法可以解决这个问题?我使用sys.calls 查看了调用堆栈,但没有记录使用原始表达式的调用,这表明这对我来说可能级别太低而无法轻松解决。

【问题讨论】:

  • 为什么需要恢复对隐式打印的调用?这仅在交互式会话中。这是打印对象的 R 控制台。
  • 我正在构建一个交互式界面,其中涉及用户以交互方式操作 S4 对象。
  • 好的,但这仍然不能真正回答问题:是否有控制台要从中恢复隐式调用来显示?
  • 我在 RStudio 中执行此操作,但理想情况下希望该解决方案可在任何控制台上运行,以便包含此方法的包不依赖于 UI。

标签: r s4 substitution


【解决方案1】:
> showDefault
function (object, oldMethods = TRUE) 
{
    clDef <- getClass(cl <- class(object), .Force = TRUE)
    cl <- classLabel(cl)
    if (!is.null(clDef) && isS4(object) && is.na(match(clDef@className, 
        .BasicClasses))) {
        cat("An object of class ", cl, "\n", sep = "")
        slots <- slotNames(clDef)
        dataSlot <- .dataSlot(slots)
        if (length(dataSlot) > 0) {
            dataPart <- slot(object, dataSlot)
            show(dataPart)
            slots <- slots[is.na(match(slots, dataSlot))]
        }
        else if (length(slots) == 0L) 
            show(unclass(object))
        for (what in slots) {
            if (identical(what, ".Data")) 
                next
            cat("Slot \"", what, "\":\n", sep = "")
            print(slot(object, what))
            cat("\n")
        }
    }
    else print(object, useS4 = FALSE)
    invisible()
}
<bytecode: 0x11c228000>
<environment: namespace:methods>

【讨论】:

  • 我不确定这如何回答我的问题。当然,我可以在我的 S4 对象上调用 showDefault,但重点是我想从 show/print 方法捕获隐式显示/打印使用的表达式(即有人在提示符下键入的内容)。也许上面有一些东西可以做到这一点,但这对我来说并不明显。
猜你喜欢
  • 2019-06-25
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
  • 2010-12-09
相关资源
最近更新 更多