Map中的 predicate 函数

hvvq6cgz  于 2022-12-20  发布在  其他
关注(0)|答案(2)|浏览(146)

我最近一直在学习purrr家族函数,当我阅读map_if的文档时,我遇到了.p参数的另一种定义形式,也就是我无法理解的 predicate 函数。
或者,如果. x的元素本身是对象列表,则可以使用指示内部列表中逻辑元素名称的字符串
我想知道是否有人能告诉我它的意思,以及当我处理一个元素也是列表的列表时,我该如何使用它。

x <- list(a = list(foo = 1:2, bar = 3:4), b = list(baz = 5:6))

一个简单的例子将不胜感激,因为我已经做了一些研究,并没有找到任何迹象。
先谢谢你了。

7gcisfzg

7gcisfzg1#

它似乎引用了一个值为TRUE/FALSE的内部变量名。下面是我创建的基本示例来测试它。
创建一个列表,其中内部列表包含一个变量的布尔值:

A <- list(foo=list(x=1, y=TRUE), bar=list(x=2, y=FALSE))

通过传递具有以下变量名称的字符串,将布尔变量(y)作为.p predicate 引用:

map_if(A, "y", as.character)

$foo
[1] "1"    "TRUE"

$bar
$bar$x
[1] 2

$bar$y
[1] FALSE

因此,它只修改了foo变量,因为yTRUE,而bar没有更改,因为yFALSE

jq6vz3qz

jq6vz3qz2#

虽然我不完全确定您实际上想要理解什么,但是以列表的列表为例,我们需要考虑到这里只有map_if可用,而pmap_if不可用,让我们采用另一个列表的列表,而不是您建议的列表。

x <- list(a = list(foo = 1:2, bar = 3:4), b = list(baz = 5:6), c = list(bird = 7:10))

现在map_if适用于.f,只要.pT,所以如果我们想取列表x中所有奇数索引列表的平均值,我们必须再次使用嵌套的map

map_if(x, as.logical(seq_along(x) %% 2) , ~map(.x, ~mean(.x)))

$a
$a$foo
[1] 1.5

$a$bar
[1] 3.5

$b
$b$baz
[1] 5 6

$c
$c$bird
[1] 8.5

我们也可以在.p中使用其他 predicate 函数。下面的例子产生相同的输出。

map_if(x, names(x) %in% c("a", "c") , ~map(.x, ~mean(.x)))

或者假设x的名称类似于

x <- list(val1 = list(foo = 1:2, bar = 3:4), ind1 = list(baz = 5:6), val2 = list(bird = 7:10))

则下面的语法将产生类似的结果

map_if(x, str_detect(names(x), "val") , ~map(.x, ~mean(.x)))

我希望这是有点接近你可能想了解。
你也可以给予一读it

相关问题