【问题标题】:replace list elements (avoid global assignment)替换列表元素(避免全局赋值)
【发布时间】:2012-12-28 14:15:45
【问题描述】:

我有一个非嵌套列表(非常简单)。有些元素是 NA,但可以用同一列表中的其他元素替换。我可以使用全局赋值运算符<<- 来实现这一点。但是我正在尝试学习更好的实践(因为这似乎给了我notes 在为 CRAN 编译包时)。问题:

  1. 我可以在没有全局分配的情况下实现这一目标吗?
  2. 如果不是,我该如何正确使用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)
})  

最终,我希望在没有全局分配的情况下执行此操作,但如果不是,那么对于 for CRAN 构建包的最佳实践是什么。

【问题讨论】:

  • 你为什么不把那个列表变成一个向量?
  • lapply + &lt;&lt;- 通常意味着您应该使用 for 循环。
  • @hadley,有用的信息。我敢打赌,这可以消除我在构建包时得到的一些注释。
  • 在极少数情况下需要使用&lt;&lt;-。参考类就是其中之一。 stackoverflow.com/questions/14302629 是另一个。

标签: r


【解决方案1】:

为了完整起见,这里是 hadley 对 for 循环的建议,因为一些类似的情况不允许使用 replace

for(i in seq_along(a[!apps])){
    L1[[nulls[i]]] <- L1[[replaces[i]]]
}

【讨论】:

    【解决方案2】:

    有一个replace 函数可以为您执行此操作:

    replace(L1, match(nulls, names(L1)), L1[match(replaces, names(L1))])
    

    您也可以使用稍微简单的which(is.na(L1)),而不是match(nulls, names(L1))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-08
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多