在lapply?deparse(substitute(x))?

时间:2013-08-29 10:43:01

标签: r lapply substitution

我想使用在deparse(substitute(x))中使用标准lapply技巧的函数。不幸的是,我只是得到了循环的论证。这是我完全没用的可重复的例子:

# some test data
a <- 5
b <- 6 
li <- list(a1=a,b2=b)

# my test function
tf <- function(obj){
nm <- deparse(substitute(obj))
res <- list(myName=nm)
res
}

tf(a)
#returns
$myName
[1] "a"

哪个好。如果我使用lapply,我会得到[[1L]]或匿名函数的x参数。

lapply(li,function(x) tf(x))
# returns
$a1
$a1$myName
[1] "x"


$b2
$b2$myName
[1] "x"

有没有办法获得以下内容?

$a1
$a1$myName
[1] "a1"


$b2
$b2$myName
[1] "b1"

如果deparse(substitute(x))lapply上有任何更一般的内容,我也很想知道。

编辑: 与使用接受多个参数并因此使用对象名称和对象本身的匿名函数相反的问题不起作用,因为tf函数只接受一个参数。所以this在这里不起作用......

1 个答案:

答案 0 :(得分:7)

可能的解决方案:

lapply(li, function(x) {
  call1 <-  sys.call(1)
  call1[[1]] <- as.name("names")
  call1 <- call1[1:2]
  nm <- eval(call1)
  y <- deparse(substitute(x))
  y <- gsub("\\D", "", y)
  y <- as.numeric(y)
  list(myname=nm[y])
})