查找函数返回的对象的名称



我的问题是给定以下函数:

spam <- function() {
  cat("eggsn")
}
bla <- spam()

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

match.call()
function() {
      cat("eggsn")
    }   
但是,

this不包括函数返回到的对象的名称。我在R-help列表、google和SO上搜索了一下,但没有找到任何有用的。有什么建议吗?

从回答我收集到,我想要的是一个安静的一面。我得解释一下我的来历,这样也许能弄清楚我的动机。我正在工作的上下文与测试有关,更具体地说,测试某个对象是否随时间变化(例如模型输出)。

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

spam <- testReferenceChange(expression)

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

…我很难想象你为什么想要这个。此外,您的spam函数返回NULL,因此看起来更加毫无意义…

尽管如此,最简单/最干净的方法是将名称传递给spam函数!
spam <- function(name) {
   cat(name, "<- eggsn")
   42 # return a value
}

bla <- spam("bla")

进入下一个级别,您可以让spam执行赋值。您还可以使用substitute来允许指定不带引号的名称:

spam <- function(name) {
   name <- as.character(substitute(name))
   cat(name, "<- eggsn")
   value <- 42
   assign(name, value, parent.frame())
}
spam(bla)
bla # 42

我也有类似的需求,并想到了这个解决方案…它可能并不完美,但到目前为止我用它取得了不错的成绩。

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

相关内容

  • 没有找到相关文章

最新更新