R 获取间接传递给函数的参数的名称

R 获取间接传递给函数的参数的名称,r,R,我想为S3对象编写一个自定义打印函数,并在下面仅使用对象的名称获得所需的结果。我怎样才能做到这一点 print.Foo <- function(x, ...) { cat(paste0(x, " (passed 'print' via ", deparse(substitute(x)), ")")) } boo <- 16 boo #> [1] 16 class(boo) <- "Foo" # sub

我想为S3对象编写一个自定义打印函数,并在下面仅使用对象的名称获得所需的结果。我怎样才能做到这一点

print.Foo <- function(x, ...) {
  cat(paste0(x, "  (passed 'print' via ", deparse(substitute(x)), ")"))
}


boo <- 16
boo
#> [1] 16
class(boo) <- "Foo"

# sub-optimal outcome
show(boo)
#> 16  (passed 'print' via object)
我想通过以下电话获得上述所需结果:

boo
#> 16  (passed 'print' via x)
我修补了以下功能,但无法使其正常工作:

setMethod(
  f = "show",
  signature = "Foo",
  function(object) {
    cat(paste0(object, "  (passed 'show' via ", deparse(substitute(object)), ")"))}
  )

show.Foo <- function(object) {
  cat(paste0(object, "  (passed 'show' via ", deparse(substitute(object)), ")"))
}
setMethod(
f=“show”,
signature=“Foo”,
功能(对象){
cat(粘贴0(对象,”(通过“显示”传递),deparse(替换(对象)),”))
)

show.Foo您试图做的事情不太管用,因为名称指向对象值,但对象值实际上并不知道它们的名称。连接是单向的。您可以查看调用堆栈以查看传递了什么,但是R控制台中的REPL使用一个特殊函数调用
print()
,而不传递您键入的变量名。无名对象出现在列表等容器中,在这种情况下,
print()
应该显示什么还不清楚。有时,多个名称可能指向同一对象。您只是想提醒用户他们刚刚键入的变量的名称吗?感谢您澄清了底层机制。我想使用此功能为用户提供一个命令,用户可以轻松地复制并粘贴到控制台。类似于:
cat(paste0(“您可以使用“”、deparse(替换(x))、“^2”来计算此对象的平方。\n”)
substitute()
技巧仅对承诺有效,然后再对其进行评估。在控制台中,表达式在打印前进行求值。当调用隐式
print()
时,无法获取在控制台上计算的表达式。它与
print(boo)
一起工作,因为函数和参数都是同时求值的(并且可以绕过隐式
print()
调用)。似乎不可能按你的要求去做。这并不适用于所有函数,只适用于在控制台上调用的隐式
print()
setMethod(
  f = "show",
  signature = "Foo",
  function(object) {
    cat(paste0(object, "  (passed 'show' via ", deparse(substitute(object)), ")"))}
  )

show.Foo <- function(object) {
  cat(paste0(object, "  (passed 'show' via ", deparse(substitute(object)), ")"))
}