从函数中抓取对象名称

时间:2013-09-21 20:20:52

标签: r

标题不是超级描述性的,因为问题比我能想到的合理标题更长。

我希望有一个函数可以从其他函数中获取对象名,这些函数可以在另一个函数中用作参数。这是一个准确的尝试:

grab <- function(x) {
    as.character(substitute(x))
}

FUN <- function(foo, bar = grab(foo)) {
    bar
}

FUN(mtcars)

这里我希望FUN返回字符串“mtcars”,但它返回“foo”。如何制作一个抓取功能来执行此操作(我想这样做,因为我将使用它作为txt / csv等文件的默认设置。这是一个方便的设置。

以下是一些不成功的尝试(但我希望有一个通用的抓取功能):

FUN2 <- function(foo, bar = as.character(substitute(bar))) {
   bar
}

FUN2(mtcars)

#==================

FUN3 <- function(foo, bar) {
    if(missing(bar)) bar <- foo
    as.character(substitute(bar))
}

FUN3(mtcars)

现实生活中的例子:

real_example <- function(obj, file = grab(obj)) {
    write.csv(obj, file = sprintf("%s.csv", file))
}

2 个答案:

答案 0 :(得分:6)

您可以尝试使用sys.call访问父呼叫:

## "which" is the number of the argument of interest
grab <- function(which) {
  ## which + 1, because [1] == name of function/call
  ## and arguments are 2:n
  as.character(sys.call(-1L)[which+1L])
}

FUN <- function(foo, bar = grab(1L)) {
  bar
}

FUN(mtcars)
# "mtcars"

答案 1 :(得分:6)

这个怎么样?

grab <- function(x) as.character(x[["foo"]])
FUN <- function(foo, bar=grab(match.call())) { bar }

FUN(mtcars)
# [1] "mtcars"