【问题标题】:Finding the name of the object a function returns to查找函数返回的对象的名称
【发布时间】:2011-12-15 15:12:03
【问题描述】:

我的问题如下。给定以下函数:

spam <- function() {
  cat("eggs\n")
}

bla <- spam()

我想找到函数返回其内容的对象的名称。在示例bla &lt;- spam() 中,这将是bla。使用match.call 我可以找到执行的调用:

match.call()
function() {
      cat("eggs\n")
    }   

然而,this 不包括函数返回的对象的名称。我在 R-help 列表、google 和 SO 上四处寻找,但找不到任何有用的东西。任何建议如何进行?

背景 从回复中,我了解到我想要的有点深奥。我会解释我来自哪里,这可能会阐明我的动机。我正在使用的上下文与测试有关,更具体地说,是测试某个对象是否随时间变化(例如模型输出)。

通常用户会编写一堆代码来生成一个对象,保存它并随着时间的推移将保存的对象与新生成的对象进行比较。用户可以使用以下函数来做到这一点:

spam <- testReferenceChange(expression)

通常,此函数将读取引用并生成一个新对象,用户可以相互比较。为了重新生成参考文件,我想使用完全相同的代码。我通过更改全局选项(参见optionsgetOption)、recalculate 来做到这一点。我们在重新计算模式下运行这个函数,新的引用被存储。现在我的问题的原因。在保存对文件的引用(使用save())时,我想使用用户返回到的对象的名称,结合日期来创建一个唯一的名称。

【问题讨论】:

  • spam 不知道它将被分配到哪里,甚至无法“看到”将赋予其结果的(未来​​)名称。名称的分配由&lt;- 完成。

标签: r function


【解决方案1】:

...我很难想象你为什么想要这个。此外,您的 spam 函数返回 NULL 所以它看起来更没有意义......

不过,最简单/最干净的方法是将名称传递给 spam 函数!

spam <- function(name) {
   cat(name, "<- eggs\n")
   42 # return a value
}


bla <- spam("bla")

进入下一个级别,您可以让spam 完成作业。您还可以使用substitute 来允许指定不带引号的名称:

spam <- function(name) {
   name <- as.character(substitute(name))
   cat(name, "<- eggs\n")
   value <- 42
   assign(name, value, parent.frame())
}

spam(bla)
bla # 42

【讨论】:

  • 感谢您的反馈。我有充分的理由这样做,并且函数返回 NULL 因为返回值对我的问题并不重要。
  • 我倾向于您更简单的解决方案,再次感谢。我只是想知道我是否可以这样解决:)。
  • 说来话长。明天上班我去试试。目前在我的智能手机上:)
  • 我在上面的问题中添加了一些背景
【解决方案2】:

我有类似的需求并想到了那个解决方案......它可能并不完美,但到目前为止我已经取得了很好的效果。

getLastCreatedObj <- function() {
  tmpfile <- tempfile("hist", fileext = ".txt")
  savehistory(file = tmpfile)
  last_command <- tail(readLines(tmpfile), 2)[1]
  unlink(tmpfile)
  if (grepl("^[a-zA-Z_.0-9]+\\s*(<-|=)", last_command)) {
    all_names <- all.names(as.expression(parse(text = s)))
    varname <- all_names[grep("(<-|=)", all_names) + 1]
    return(varname)
  }
  return(NULL)
}

请注意,您不能在包中使用它;使用消息 'savehistory' can only be used in Rgui and Rterm 检查失败。

【讨论】:

    猜你喜欢
    • 2021-06-28
    • 2023-04-04
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    相关资源
    最近更新 更多