我不知道下面的代码是否非常优雅,但它可以工作。这是一个双 *apply 循环。
引用问题:
我可以轻松编写处理a 并调用setattr 5 次的代码来完成此操作。但我希望有更好的方法。
问题是setattr 中的name 必须是长度为1 的字符串,所以setattr 总是要被调用5 次。在下面的代码中,这是伪装成双循环完成的。
例子data.table来自help("setattr")中的第三个DT。
library(data.table)
DT <- data.table(x1 = 1:3, y = 4:6, x3 = 7:9)
a <- list(x1=list(label='X1', units='mm'),
x3=list(label='X3', comment='collected remotely', format='type 3'))
mapply(function(x, a){
lapply(names(a), function(na) setattr(DT[[x]], na, a[[na]]))
}, names(a), a)
attributes(DT$x1)
#$label
#[1] "X1"
#
#$units
#[1] "mm"
attributes(DT$x3)
#$label
#[1] "X3"
#
#$comment
#[1] "collected remotely"
#
#$format
#[1] "type 3"
注意。为了避免循环输出丑陋,请将它们包装在invisible中:
invisible(
mapply(function(x, a){
lapply(names(a), function(na) setattr(DT[[x]], na, a[[na]]))
}, names(a), a)
)
编辑
下面的代码比较简单。
lapply(names(a), function(x){
lapply(names(a[[x]]), function(y) setattr(DT[[x]], y, a[[x]][[y]]))
})