r-assign()只用于数组的一张表-避免手动更改



我有一些数组需要填写。数组的名称是可变的,但它们始终会执行相同的函数。基本上,我只需要一种方法来替换一个";片材";将一个数组与另一个数组进行比较,而无需手动输入数组名称。以下示例:

big_array_1 <- array(dim = c(5,5,10))
big_array_1[,,1] <- sample(c(1:10), 25, replace=T)
big_array_2 <- array(dim = c(5,5,10))
big_array_2[,,1] <- sample(c(40:50), 25, replace=T)

small_array <- array(dim = c(5,5,2))
small_array[,,] <- sample(c(20:30), 50, replace=T)

因此,每个大数组都必须用小数组的第二个表来替换它的第二张表(第三维度(,但我只想能够设置一个数字(即大数组"1"或"2"(来在我的代码中实现这一点,而不是每次手动更改名称。

# So I know I can do this, but I want to avoid manually changing the "_1" to "_2" when I run the script
big_array_1[,,2] <- small_array[,,2]
# instead, I'm hoping I can use a variable and some kind of assign()
arraynumber <- 1

# but this gives an error for assigning a non-language object
get(paste0("big_array_",arraynumber))[,,2] <- small_array[,,2]
# and this gives an error for invalid first argument. 
assign(get(paste0("big_array_",arraynumber))[,,2],  small_array[,,2])
# even though get(paste0("big_array_",arraynumber))[,,2] works on its own. 

有什么建议吗?

在R中,不能为get()的结果赋值。此外,不建议使用assign,即使是attacheval+parselist2env和其他难以调试的环境变化动态方法。

如前所述,只需将命名列表用于结构相同的对象。列表可以包含任何对象,从数组到数据帧再到绘图,无数量限制。更重要的是,您可以避免使用单独命名的对象淹没全局环境,而是使用包含许多底层元素的少数列表,这些元素可以更好地管理数据以满足分配或迭代需求。

定义

set.seed(8620)
# NAMED LIST OF TWO ARRAYS 
big_array_list <- list(big_array_1 = array(dim = c(5,5,10)),
big_array_2 = array(dim = c(5,5,10)))
big_array_list$big_array_1[,,1] <- sample(c(1:10), 25, replace=TRUE)
big_array_list$big_array_2[,,1] <- sample(c(40:50), 25, replace=TRUE)
# NAMED LIST OF ONE ARRAY
small_array_list <- list(small_array_1 = array(sample(c(20:30), 50, replace=TRUE),
dim = c(5,5,2)))

分配

# ASSIGN BY FIXED NAME
big_array_list$big_array_1[,,2] <- small_array_list$small_array_1[,,2]
big_array_list$big_array_1[,,2]
#      [,1] [,2] [,3] [,4] [,5]
# [1,]   30   29   26   24   23
# [2,]   21   20   22   20   24
# [3,]   27   24   26   30   30
# [4,]   30   26   24   29   25
# [5,]   26   21   26   20   30
# ASSIGN BY DYNAMIC NAME
arraynumber <- 1
big_array_list[[paste0("big_array_",arraynumber)]][,,2] <- small_array_list[[paste0("small_array_",arraynumber)]][,,2]
big_array_list[[paste0("big_array_",arraynumber)]][,,2]
#      [,1] [,2] [,3] [,4] [,5]
# [1,]   30   29   26   24   23
# [2,]   21   20   22   20   24
# [3,]   27   24   26   30   30
# [4,]   30   26   24   29   25
# [5,]   26   21   26   20   30
# ASSIGN BY INDEX
big_array_list[[1]][,,2] <- small_array_list[[1]][,,2]
big_array_list[[1]][,,2]
#      [,1] [,2] [,3] [,4] [,5]
# [1,]   30   29   26   24   23
# [2,]   21   20   22   20   24
# [3,]   27   24   26   30   30
# [4,]   30   26   24   29   25
# [5,]   26   21   26   20   30

迭代需求

# RETURN DIMENSIONS OF EACH big_array
lapply(big_array_list, dim)
# SHOW FIRST 5 ELEMENTS OF EACH big_array
sapply(big_array_list, `[`, 1:5)
# RETURN LIST WHERE ALL big_arrays ARE EQUAL TO small_array 
mapply(`<-`, big_array_list, small_array_list, SIMPLIFY=FALSE)

最新更新