在lappy中使用deparse(替代品(x))?
我想使用一个函数,它在在lappy中使用deparse(替代品(x))?,r,lapply,substitution,R,Lapply,Substitution,我想使用一个函数,它在lappy中使用标准的deparse(替换(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)
lappy
中使用标准的deparse(替换(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"
有没有办法获得以下信息
$a1
$a1$myName
[1] "a1"
$b2
$b2$myName
[1] "b1"
如果在deparse(替换(x))
和lappy
上有什么更一般的东西,我也很想知道
编辑:
与使用接受多个参数并因此可以使用对象名称和对象本身的匿名函数不同,问题在于,tf
函数只接受一个参数。所以在这里不起作用 一个可能的解决方案:
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])
})
lappy(li,函数(x){
调用1与大多数R一样,lappy
将值传递给函数,而不是变量引用。感谢指针James,我想我能够在这里找到类似的东西:。我将检查它,并将此问题作为副本删除,或者在我能够回答我自己的问题时添加答案。获取ca的非常聪明的方法你的函数可以简化为:lappy(li,函数(x)名称(eval(sys.call(1)[[2]])[substitute(x)[[3]])
。注意,sys.call(1)[[2]]
将用作列表参数的符号或表达式返回给lappy
,以及substitute(x)[[3]]
返回循环中的当前索引。我确实按照您的方式,但在每次迭代中,您都必须调用对象(eval(sys.call(1)),而不是对象的名称。对于大型对象,它的功能是否会减弱?eval(sys.call(1)[[2]]
在这种情况下通常会产生一个符号,li
,并且可能不会导致它引用的对象重复,因为这是传递给names
这是一个基本函数。或者,您可以保存名称nm
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])
})