По аналогии с R - составные функции по сравнению с конвейерными функциями в `purrr :: map ()` , легче увидеть, что происходит, когда вы используете анонимные функции, а не формула (~).
Начните с
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"