将元素分配给嵌套的 purrr 映射中的列表
Assigning elements to a list in a nested purrr map
我试图在嵌套 purrr::map 调用中将元素分配给列表——这基本上应该与嵌套 for 循环相同:
res <- list()
for (i in 1:4) {
for (j in letters[1:3]) {
res[[paste(i,j)]] <- paste(i,j)
}
}
str(res)
#> List of 12
#> $ 1 a: chr "1 a"
#> $ 1 b: chr "1 b"
#> $ 1 c: chr "1 c"
#> $ 2 a: chr "2 a"
#> $ 2 b: chr "2 b"
#> $ 2 c: chr "2 c"
#> $ 3 a: chr "3 a"
#> $ 3 b: chr "3 b"
#> $ 3 c: chr "3 c"
#> $ 4 a: chr "4 a"
#> $ 4 b: chr "4 b"
#> $ 4 c: chr "4 c"
但是,当我尝试将其转换为 purrr
时,结果打印到控制台,但从未存储在列表对象中 res_purrr
?
library(purrr)
res_purrr <- list()
map(1:4, function(i)
map(letters[1:3], function(j)
res_purrr[[paste(i,j)]] <- paste(i,j)
)
)
res_purrr
#> list()
运行 与 walk
相同的代码 returns 相同的空 res_purrr
对象。
使用您的代码,我们可以简单地添加 res_purr <-
res_purrr <- map(1:4, function(i)
map(letters[1:3], function(j)
res_purrr[[paste(i,j)]] <- paste(i,j)
)
)
str(res_purrr)
# List of 4
# $ :List of 3
# ..$ : chr "1 a"
# ..$ : chr "1 b"
# ..$ : chr "1 c"
# ...
编辑
如果问题是关于重现 res
而不是未能存储 map
的结果,这里作为@Moody_Mudskipper 答案的(类似但)替代方法:
x <- do.call(paste, expand.grid(1:3, letters[1:4], stringsAsFactors = FALSE))
res <- setNames(as.list(x), x)
str(res)
# List of 12
# $ 1 a: chr "1 a"
# $ 2 a: chr "2 a"
# ...
这里使用自定义函数代替 paste
x <- do.call(function (Var1,Var2) paste(sqrt(Var1),toupper(Var2)),
expand.grid(1:4, letters[1:3], stringsAsFactors = FALSE))
res <- setNames(as.list(x), x)
str(res)
# List of 12
# $ 1 A : chr "1 A"
# $ 1.4142135623731 A : chr "1.4142135623731 A"
# $ 1.73205080756888 A: chr "1.73205080756888 A"
# $ 2 A : chr "2 A"
# ...
我会做以下事情:
library(purrr)
res_purrr <- expand.grid(1:4,letters[1:3],stringsAsFactors = FALSE) %>%
pmap(paste) %>%
set_names()
str(res_purrr)
# List of 12
# $ 1 a: chr "1 a"
# $ 2 a: chr "2 a"
# $ 3 a: chr "3 a"
# $ 4 a: chr "4 a"
# $ 1 b: chr "1 b"
# $ 2 b: chr "2 b"
# $ 3 b: chr "3 b"
# $ 4 b: chr "4 b"
# $ 1 c: chr "1 c"
# $ 2 c: chr "2 c"
# $ 3 c: chr "3 c"
# $ 4 c: chr "4 c"
这个问题是相关的:
我试图在嵌套 purrr::map 调用中将元素分配给列表——这基本上应该与嵌套 for 循环相同:
res <- list()
for (i in 1:4) {
for (j in letters[1:3]) {
res[[paste(i,j)]] <- paste(i,j)
}
}
str(res)
#> List of 12
#> $ 1 a: chr "1 a"
#> $ 1 b: chr "1 b"
#> $ 1 c: chr "1 c"
#> $ 2 a: chr "2 a"
#> $ 2 b: chr "2 b"
#> $ 2 c: chr "2 c"
#> $ 3 a: chr "3 a"
#> $ 3 b: chr "3 b"
#> $ 3 c: chr "3 c"
#> $ 4 a: chr "4 a"
#> $ 4 b: chr "4 b"
#> $ 4 c: chr "4 c"
但是,当我尝试将其转换为 purrr
时,结果打印到控制台,但从未存储在列表对象中 res_purrr
?
library(purrr)
res_purrr <- list()
map(1:4, function(i)
map(letters[1:3], function(j)
res_purrr[[paste(i,j)]] <- paste(i,j)
)
)
res_purrr
#> list()
运行 与 walk
相同的代码 returns 相同的空 res_purrr
对象。
使用您的代码,我们可以简单地添加 res_purr <-
res_purrr <- map(1:4, function(i)
map(letters[1:3], function(j)
res_purrr[[paste(i,j)]] <- paste(i,j)
)
)
str(res_purrr)
# List of 4
# $ :List of 3
# ..$ : chr "1 a"
# ..$ : chr "1 b"
# ..$ : chr "1 c"
# ...
编辑
如果问题是关于重现 res
而不是未能存储 map
的结果,这里作为@Moody_Mudskipper 答案的(类似但)替代方法:
x <- do.call(paste, expand.grid(1:3, letters[1:4], stringsAsFactors = FALSE))
res <- setNames(as.list(x), x)
str(res)
# List of 12
# $ 1 a: chr "1 a"
# $ 2 a: chr "2 a"
# ...
这里使用自定义函数代替 paste
x <- do.call(function (Var1,Var2) paste(sqrt(Var1),toupper(Var2)),
expand.grid(1:4, letters[1:3], stringsAsFactors = FALSE))
res <- setNames(as.list(x), x)
str(res)
# List of 12
# $ 1 A : chr "1 A"
# $ 1.4142135623731 A : chr "1.4142135623731 A"
# $ 1.73205080756888 A: chr "1.73205080756888 A"
# $ 2 A : chr "2 A"
# ...
我会做以下事情:
library(purrr)
res_purrr <- expand.grid(1:4,letters[1:3],stringsAsFactors = FALSE) %>%
pmap(paste) %>%
set_names()
str(res_purrr)
# List of 12
# $ 1 a: chr "1 a"
# $ 2 a: chr "2 a"
# $ 3 a: chr "3 a"
# $ 4 a: chr "4 a"
# $ 1 b: chr "1 b"
# $ 2 b: chr "2 b"
# $ 3 b: chr "3 b"
# $ 4 b: chr "4 b"
# $ 1 c: chr "1 c"
# $ 2 c: chr "2 c"
# $ 3 c: chr "3 c"
# $ 4 c: chr "4 c"
这个问题是相关的: