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

时间:2011-12-15 15:12:03

标签: r function

我的问题如下。鉴于以下功能:

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

bla <- spam()

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

match.call()
function() {
      cat("eggs\n")
    }   
但是,这不包括函数返回的对象的名称。我查看了R-help列表,谷歌和SO,但找不到任何有用的东西。有什么建议怎么办?

背景 从回复中我得知,我想要的是有点在等待的一面。我会解释一下我来自哪里,这可能会对我的动机有所了解。我正在处理的上下文与测试有关,更具体地说,测试某个对象是否随时间变化(例如模型输出)。

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

spam <- testReferenceChange(expression)

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

2 个答案:

答案 0 :(得分:3)

......我发现很难想象你为什么会这样想。此外,您的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

答案 1 :(得分:0)

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

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进行检查。