在lapply?deparse(substitute(x))?

Mat*_*ert 19 r substitution lapply

我想使用一个使用标准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"
Run Code Online (Sandbox Code Playgroud)

这很好.如果我使用lapply我得到[[1L]]x匿名函数的参数.

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


$b2
$b2$myName
[1] "x"
Run Code Online (Sandbox Code Playgroud)

有没有办法获得以下?

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


$b2
$b2$myName
[1] "b1"
Run Code Online (Sandbox Code Playgroud)

如果有更一般的东西deparse(substitute(x)),lapply我也渴望知道.

编辑:问题,而不是使用接受多个参数的匿名函数,因此可以使用对象的名称和对象本身不起作用,因为该tf函数只接受一个参数.所以在这里不起作用......

dro*_*opy 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])
})
Run Code Online (Sandbox Code Playgroud)

  • 非常聪明的方式接听电话.你的函数可以简化为:`lapply(li,function(x)names(eval(sys.call(1)[[2]]))[substitute(x)[[3]]])`.注意`sys.call(1)[[2]]`将用作list参数的符号或表达式返回给`lapply`,`substitute(x)[[3]]`返回循环中的当前索引. (2认同)