【问题标题】:deparse(substitute(x)) in lapply?lapply中的deparse(substitute(x))?
【发布时间】:2013-09-01 18:13:57
【问题描述】:

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

# 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在这里不起作用...

【问题讨论】:

  • 与大多数 R 一样,lapply 将值传递给函数,而不是变量引用。
  • 感谢 James 的指点,我想我可以在这里找到类似的东西:stackoverflow.com/questions/9950144/…。我会检查它,或者删除这个重复的问题,或者在我能够回答我自己的问题后立即添加答案。

标签: r lapply substitution


【解决方案1】:

一个可能的解决方案:

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])
})

【讨论】:

  • 非常聪明的接电话方式。您的功能可以简化为:lapply(li, function(x)names(eval(sys.call(1)[[2]]))[substitute(x)[[3]]])。请注意,sys.call(1)[[2]] 返回用作lapply 列表参数的符号或表达式,substitute(x)[[3]] 返回循环中的当前索引。
  • 我真的是你的方式,但在每次迭代中你都必须调用对象 (eval(sys.call(1))) 而不是对象的名称。对于大型物体,它会不会那么强大?
  • eval(sys.call(1)[[2]]) 通常会产生一个符号,在这种情况下是 li,并且可能不会导致它引用的对象的重复,因为它被传递给 names 这是一个原始函数.作为替代方案,您可以先保存名称nm &lt;- names(li),然后使用lapply(li, function(x)nm[substitute(x)[[3]]])
猜你喜欢
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2021-04-10
  • 2017-04-26
  • 2018-03-09
  • 2015-06-16
  • 1970-01-01
相关资源
最近更新 更多