【问题标题】:Assigning value to list elements in for loop, list names depending on loop为for循环中的列表元素赋值,列表名称取决于循环
【发布时间】:2022-01-05 09:06:32
【问题描述】:

我有以下问题。我正在使用两个 for 循环(在 i 和 j 上运行)并使用 assign 函数创建名称取决于 i 和 j 的列表。现在,在另一个带有两个循环的 for 循环中,我想用栅格填充我创建的列表,即 19 个栅格。但是,我没有调用我的列表,因为它们依赖于 i 和 j,因此我无法填写它们。

最后,我希望有 25 个带有名称 rasterList_10N_010E、rasterList_20N_010E、...的列表,每个列表都有 19 个条目以及各自的栅格。

您可以在下面找到我的代码。我已经删除了对我的问题不重要的行(我实际上也根据循环中的 i 和 j 生成了我想要存储在列表中的栅格)。

for(i in 1:5){
for(j in 1:5){
nam <- paste0("rasterList_", i*10, "N_0", j*10, "E") 
assign(nam, list())    

  for (k in 1:19){
     raster_test <- raster(ncol=36, nrow=18, xmn=-1000, xmx=1000, ymn=-100, ymx=900)
    #here the list with the name nam should be standing
    rasterList_10N_010E[[k]] <- raster_test
      }
    }
  }

我已经尝试过使用

的解决方案
eval(as.name(nam))[[k]] <- raster_test

as.name(nam)[[k]] <- raster_test

但它不起作用。我认为问题可能在于该方法不是很像 R(我最近刚从 Stata 更改为 R)?

谢谢!

【问题讨论】:

  • 请忘记您听说过assigneval 函数。它们完全不足以解决此类问题,并使代码变得更加复杂而无济于事。请改用命名列表。 (这种类型的问题在这里非常常见,在这种情况下使用assigneval从不正确答案;这些函数的用途非常不同。)

标签: r for-loop names


【解决方案1】:

我建议不要创建 25 个单独的列表,而是将您的列表放入一个列表中,如下所示:

注意:为简单起见,我设置了k = 2

library(raster)
#> Loading required package: sp

rasterList <- list()

for (i in 1:5) {
  for (j in 1:5) {
    name <- paste0(i * 10, "N_0", j * 10, "E")
    rasterList[[name]] <- list()
    for (k in 1:2) {
      raster_test <- raster(ncol = 36, nrow = 18, xmn = -1000, xmx = 1000, ymn = -100, ymx = 900)
      rasterList[[name]][k] <- raster_test
    }
  }
}

length(rasterList)
#> [1] 25

rasterList[["10N_010E"]]
#> [[1]]
#> class      : RasterLayer 
#> dimensions : 18, 36, 648  (nrow, ncol, ncell)
#> resolution : 55.55556, 55.55556  (x, y)
#> extent     : -1000, 1000, -100, 900  (xmin, xmax, ymin, ymax)
#> crs        : NA 
#> 
#> 
#> [[2]]
#> class      : RasterLayer 
#> dimensions : 18, 36, 648  (nrow, ncol, ncell)
#> resolution : 55.55556, 55.55556  (x, y)
#> extent     : -1000, 1000, -100, 900  (xmin, xmax, ymin, ymax)
#> crs        : NA

如果仍然需要,您可以在之后获得 25 个列表,如下所示:

lapply(names(rasterList), function(x) assign(paste0("rasterList_", x), rasterList[[x]], envir = .GlobalEnv))

reprex package (v2.0.1) 于 2022-01-05 创建

【讨论】:

    猜你喜欢
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 2021-12-05
    相关资源
    最近更新 更多