将嵌套列表的第二个元素设置为列表元素的名称 (purrr)
Set the second element of a nested list to the list's element's name (purrr)
我有一个列表的命名列表,其中包含我要填充的空元素:
List of 3
$ name1:List of 3
..$ A: NULL
..$ B: NULL
..$ C: NULL
$ name2:List of 3
..$ I: NULL
..$ J: NULL
..$ K: NULL
$ name3:List of 3
..$ P: NULL
..$ Q: NULL
..$ R: NULL
我可以将向量分配给每个子列表的第二个元素:
testlist <- map(testlist, ~modify_at(.x, 2, ~c("one", "two", "three")))
str(testlist)
List of 3
$ name1:List of 3
..$ A: NULL
..$ B: chr [1:3] "one" "two" "three"
..$ C: NULL
$ name2:List of 3
..$ I: NULL
..$ J: chr [1:3] "one" "two" "three"
..$ K: NULL
$ name3:List of 3
..$ P: NULL
..$ Q: chr [1:3] "one" "two" "three"
..$ R: NULL
但现在我想将列表中每个元素的名称分配给每个子列表的第三个元素(即该元素的名称在循环的每一轮都不同)。期望的输出:
List of 3
$ name1:List of 3
..$ A: NULL
..$ B: NULL
..$ C: chr "name1"
$ name2:List of 3
..$ I: NULL
..$ J: NULL
..$ K: chr "name2"
$ name3:List of 3
..$ P: NULL
..$ Q: NULL
..$ R: chr "name3"
并且对前面的函数进行简单的修改也不起作用:
map(testlist, ~modify_at(.x, 3, ~.x))
当我这样做时,每个子列表的第三个元素完全消失了:
List of 3
$ name1:List of 2
..$ A: NULL
..$ B: NULL
$ name2:List of 2
..$ I: NULL
..$ J: NULL
$ name3:List of 2
..$ P: NULL
..$ Q: NULL
我尝试了各种组合,包括 set_names(.x) 甚至 map2:
map2(testlist, names(testlist), ~modify_at(.x, 3, ~.y))
(最后一位相当于imap)
但没有任何效果,其中许多导致删除每个子列表的第三个元素。而且主榜单的名字也没有错
names(testlist)
[1] "name1" "name2" "name3"
我不太确定那里发生了什么。任何提示和帮助将不胜感激。
与类似,使用匿名函数比使用公式 (~) 符号更容易看出发生了什么。
开始于
testlist <- list(name1=list(NULL,NULL,NULL), name2=list(NULL,NULL,NULL),
name3=list(NULL,NULL,NULL))
str(testlist)
#> List of 3
#> $ name1:List of 3
#> ..$ : NULL
#> ..$ : NULL
#> ..$ : NULL
#> $ name2:List of 3
#> ..$ : NULL
#> ..$ : NULL
#> ..$ : NULL
#> $ name3:List of 3
#> ..$ : NULL
#> ..$ : NULL
#> ..$ : NULL
然后重新创建您的第一个示例
testlist2 <- map(testlist, ~modify_at(.x, 2, ~c("one", "two", "three")))
可以重写为 testlist2_expand <- map(testlist, function(x) modify_at(x, 2, function(y) y=c("one", "two", "three")))
,它为
的 str(testlist2_expand)
提供相同的输出
#> List of 3
#> $ name1:List of 3
#> ..$ : NULL
#> ..$ : chr [1:3] "one" "two" "three"
#> ..$ : NULL
#> $ name2:List of 3
#> ..$ : NULL
#> ..$ : chr [1:3] "one" "two" "three"
#> ..$ : NULL
#> $ name3:List of 3
#> ..$ : NULL
#> ..$ : chr [1:3] "one" "two" "three"
#> ..$ : NULL
但是你的第二个例子map(testlist, ~modify_at(.x, 3, ~.x))
确实
map(testlist, function(x) modify_at(x, 1, function (y) y = y))
我认为您希望 .x 得到重用,但它是新范围内的新变量。它从未被定义,因此被评估为 NULL,导致 map(testlist, function(x) modify_at(x, 1, function (y) NULL))
并且元素被删除
做你想做的事
testlist2 <- map2(testlist, names(testlist), function(x,y) modify_at(x, 3, function (z) z = y))
str(testlist2)
#> List of 3
#> $ name1:List of 3
#> ..$ : NULL
#> ..$ : NULL
#> ..$ : chr "name1"
#> $ name2:List of 3
#> ..$ : NULL
#> ..$ : NULL
#> ..$ : chr "name2"
#> $ name3:List of 3
#> ..$ : NULL
#> ..$ : NULL
#> ..$ : chr "name3"
我有一个列表的命名列表,其中包含我要填充的空元素:
List of 3
$ name1:List of 3
..$ A: NULL
..$ B: NULL
..$ C: NULL
$ name2:List of 3
..$ I: NULL
..$ J: NULL
..$ K: NULL
$ name3:List of 3
..$ P: NULL
..$ Q: NULL
..$ R: NULL
我可以将向量分配给每个子列表的第二个元素:
testlist <- map(testlist, ~modify_at(.x, 2, ~c("one", "two", "three")))
str(testlist)
List of 3
$ name1:List of 3
..$ A: NULL
..$ B: chr [1:3] "one" "two" "three"
..$ C: NULL
$ name2:List of 3
..$ I: NULL
..$ J: chr [1:3] "one" "two" "three"
..$ K: NULL
$ name3:List of 3
..$ P: NULL
..$ Q: chr [1:3] "one" "two" "three"
..$ R: NULL
但现在我想将列表中每个元素的名称分配给每个子列表的第三个元素(即该元素的名称在循环的每一轮都不同)。期望的输出:
List of 3
$ name1:List of 3
..$ A: NULL
..$ B: NULL
..$ C: chr "name1"
$ name2:List of 3
..$ I: NULL
..$ J: NULL
..$ K: chr "name2"
$ name3:List of 3
..$ P: NULL
..$ Q: NULL
..$ R: chr "name3"
并且对前面的函数进行简单的修改也不起作用:
map(testlist, ~modify_at(.x, 3, ~.x))
当我这样做时,每个子列表的第三个元素完全消失了:
List of 3
$ name1:List of 2
..$ A: NULL
..$ B: NULL
$ name2:List of 2
..$ I: NULL
..$ J: NULL
$ name3:List of 2
..$ P: NULL
..$ Q: NULL
我尝试了各种组合,包括 set_names(.x) 甚至 map2:
map2(testlist, names(testlist), ~modify_at(.x, 3, ~.y))
(最后一位相当于imap)
但没有任何效果,其中许多导致删除每个子列表的第三个元素。而且主榜单的名字也没有错
names(testlist)
[1] "name1" "name2" "name3"
我不太确定那里发生了什么。任何提示和帮助将不胜感激。
与
开始于
testlist <- list(name1=list(NULL,NULL,NULL), name2=list(NULL,NULL,NULL),
name3=list(NULL,NULL,NULL))
str(testlist)
#> List of 3
#> $ name1:List of 3
#> ..$ : NULL
#> ..$ : NULL
#> ..$ : NULL
#> $ name2:List of 3
#> ..$ : NULL
#> ..$ : NULL
#> ..$ : NULL
#> $ name3:List of 3
#> ..$ : NULL
#> ..$ : NULL
#> ..$ : NULL
然后重新创建您的第一个示例
testlist2 <- map(testlist, ~modify_at(.x, 2, ~c("one", "two", "three")))
可以重写为 testlist2_expand <- map(testlist, function(x) modify_at(x, 2, function(y) y=c("one", "two", "three")))
,它为
str(testlist2_expand)
提供相同的输出
#> List of 3
#> $ name1:List of 3
#> ..$ : NULL
#> ..$ : chr [1:3] "one" "two" "three"
#> ..$ : NULL
#> $ name2:List of 3
#> ..$ : NULL
#> ..$ : chr [1:3] "one" "two" "three"
#> ..$ : NULL
#> $ name3:List of 3
#> ..$ : NULL
#> ..$ : chr [1:3] "one" "two" "three"
#> ..$ : NULL
但是你的第二个例子map(testlist, ~modify_at(.x, 3, ~.x))
确实
map(testlist, function(x) modify_at(x, 1, function (y) y = y))
我认为您希望 .x 得到重用,但它是新范围内的新变量。它从未被定义,因此被评估为 NULL,导致 map(testlist, function(x) modify_at(x, 1, function (y) NULL))
并且元素被删除
做你想做的事
testlist2 <- map2(testlist, names(testlist), function(x,y) modify_at(x, 3, function (z) z = y))
str(testlist2)
#> List of 3
#> $ name1:List of 3
#> ..$ : NULL
#> ..$ : NULL
#> ..$ : chr "name1"
#> $ name2:List of 3
#> ..$ : NULL
#> ..$ : NULL
#> ..$ : chr "name2"
#> $ name3:List of 3
#> ..$ : NULL
#> ..$ : NULL
#> ..$ : chr "name3"