如何使用 mapply 复制嵌套的 for 循环?
How do I replicate a nested for loop with mapply?
我想在 R 中矢量化列表的创建,但只能通过嵌套的 for 循环获得我想要的内容。为了重现性,我已经包含了一个大大简化的问题版本。有人可以帮我修改或替换我的 mapply 函数吗?
所需功能:
my_list <- list()
A <- c("one", "two", "three", "four")
B <- c("left", "right")
for (a in A) {
for (b in B) {
my_list <- c(my_list, paste(a, b))
}
}
print(my_list)
输出(为简洁起见编辑为白色 space):
[[1]] [1] "one left"
[[2]] [1] "one right"
[[3]] [1] "two left"
[[4]] [1] "two right"
[[5]] [1] "three left"
[[6]] [1] "three right"
[[7]] [1] "four left"
[[8]] [1] "four right"
我对此进行向量化的尝试:
combinate <- function(a, b) {
return(paste(a, b))
}
mapply(combinate, a=A, b=B, SIMPLIFY=FALSE)
输出:
$one [1] "one left"
$two [1] "two right"
$three [1] "three left"
$four [1] "four right"
我不关心标签;我担心通过循环遍历两个列表获得所有八个结果。我找到了文档,表明 mapply 通过将两个列表中的第一项配对,然后将两个列表中的第二项配对,等等来完成它应该做的事情。重复较短的列表。但是经过大量搜索,我找不到必须存在的东西,一种像嵌套 for 循环一样组合配对所有列表项的方法。
我们可以用 expand.grid
和 paste
v1 <- do.call(paste, expand.grid(A, B))
或 outer
v1 <- c(outer(A, B, paste))
如果这些需要在 list
as.list(v1)
检查 OP 的输出
identical(as.list( c(t(outer(A, B, paste)))), my_list)
#[1] TRUE
我想在 R 中矢量化列表的创建,但只能通过嵌套的 for 循环获得我想要的内容。为了重现性,我已经包含了一个大大简化的问题版本。有人可以帮我修改或替换我的 mapply 函数吗?
所需功能:
my_list <- list()
A <- c("one", "two", "three", "four")
B <- c("left", "right")
for (a in A) {
for (b in B) {
my_list <- c(my_list, paste(a, b))
}
}
print(my_list)
输出(为简洁起见编辑为白色 space):
[[1]] [1] "one left"
[[2]] [1] "one right"
[[3]] [1] "two left"
[[4]] [1] "two right"
[[5]] [1] "three left"
[[6]] [1] "three right"
[[7]] [1] "four left"
[[8]] [1] "four right"
我对此进行向量化的尝试:
combinate <- function(a, b) {
return(paste(a, b))
}
mapply(combinate, a=A, b=B, SIMPLIFY=FALSE)
输出:
$one [1] "one left"
$two [1] "two right"
$three [1] "three left"
$four [1] "four right"
我不关心标签;我担心通过循环遍历两个列表获得所有八个结果。我找到了文档,表明 mapply 通过将两个列表中的第一项配对,然后将两个列表中的第二项配对,等等来完成它应该做的事情。重复较短的列表。但是经过大量搜索,我找不到必须存在的东西,一种像嵌套 for 循环一样组合配对所有列表项的方法。
我们可以用 expand.grid
和 paste
v1 <- do.call(paste, expand.grid(A, B))
或 outer
v1 <- c(outer(A, B, paste))
如果这些需要在 list
as.list(v1)
检查 OP 的输出
identical(as.list( c(t(outer(A, B, paste)))), my_list)
#[1] TRUE