我有一个非嵌套列表(非常简单)。有些元素是 NA,但可以用同一列表中的其他元素替换。我可以使用全局赋值运算符来实现这一点<<-
。但是我正在尝试学习更好的实践(因为这似乎在notes
为 CRAN 编译包时给了我)。问题:
- 我可以在没有全局分配的情况下实现这一目标吗?
- 如果不是,我该如何
assign
正确使用(我的方法似乎制作了同一数据集的一堆副本,并且可能会遇到内存问题)。
我已经尝试分配,但它不起作用。我也尝试在lapply
没有全局分配的情况下使用,但我只能返回最后一个元素,而不是替换每个元素的列表。
这是问题所在:
#Fake Data
L1 <- lapply(1:3, function(i) rnorm(1))
L1[4:5] <- NA
names(L1) <- letters[1:5]
#items to replace and their replacements (names of elements to replace)
nulls <- names(L1[sapply(L1, function(x) is.na(x))])
replaces <- c("b", "a")
#doesn't work (returns only last element)
lapply(seq_along(nulls), function(i) {
L1[[nulls[i]]] <- L1[[replaces[i]]]
return(L1)
})
#works but considered bad practice by many
lapply(seq_along(nulls), function(i) {
L1[[nulls[i]]] <<- L1[[replaces[i]]]
})
#does not work (I try L1[["d"]] and still get NA)
lapply(seq_along(nulls), function(i) {
assign(paste0("L1[[", nulls[i], "]]"), L1[[replaces[i]]], envir = .GlobalEnv)
})
#also bad practice bu I tried
lapply(seq_along(nulls), function(i) {
assign(paste0("L1$", nulls[i]), L1[[replaces[i]]], envir = .GlobalEnv)
})
#This works but it feels like we're making a ton of copies of the same data set
lapply(seq_along(nulls), function(i) {
L1[[nulls[i]]] <- L1[[replaces[i]]]
assign("L1", L1, envir = .GlobalEnv)
})
最终,我想在没有全局分配的情况下执行此操作,但如果不是,那么对于 CRAN 构建包的最佳实践是什么。