我不知道下面的代码是否非常优雅,但它能够工作。这是一个双重的
*apply
循环。
引用问题:
我可以轻松地编写处理a
并调用setattr
5次以完成此操作的代码。但我希望有更好的方法。
问题在于
setattr
中的
name
必须是一个长度为1的字符字符串,因此
setattr
将始终需要被调用5次。在下面的代码中,这是通过一个双重循环来实现的。
示例
data.table
来自于
help("setattr")
中的第3个
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)
attributes(DT$x3)
注意。为了避免循环输出的丑陋结果,将它们包裹在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]]))
})
class(x) <- unique(c(class(x), newclass))
。 - Frank Harrell