gpt4 book ai didi

r - 使用 purrr::pmap 处理 .f 列表名称

转载 作者:行者123 更新时间:2023-12-04 17:15:18 24 4
gpt4 key购买 nike

以下工作正常:

pmap_dbl(iris, ~ ..1 + ..2 + ..3 + ..4)
.l 的文档规定 A list of lists. ... List names will be used if present. .这表明您应该能够使用列表名称(即列名称)。然而:
pmap_dbl(iris, ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width)
Error in .f(Sepal.Length = .l[[c(1L, i)]], Sepal.Width = .l[[c(2L, i)]], :
object 'Sepal.Length' not found

在实践中如何利用列表名称?

最佳答案

公式参数 ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width传递给 purrr::as_mapper .

purrr::as_mapper(~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width)
# function (..., .x = ..1, .y = ..2, . = ..1)
# Sepal.Length + Sepal.Width + Petal.Length + Petal.Width

你可以看到这个函数没有直接的方法来知道这些变量是什么。

我可以想到 3 种方法来解决这个问题。我将使用@zacdav 的例子,因为它比你的更紧凑和可读:
named_list <- list(one = c(1, 1),
two = c(2, 2),
three = c(3, 3))

显式定义

您可以明确定义这些变量,如@zacdav 的答案所示,它将起作用。

探索点参数

有一种方法可以通过 ... 访问命名参数。 as_mapper返回的函数参数.

函数的参数在名称可用时命名,正如文档所述。

这解释了为什么 pmap(named_list, function(x,y,z) x+y+z)将失败并出现错误:

unused arguments (one = .l[[c(1, i)]], two = .l[[c(2, i)]], three = .l[[c(3, i)]])



看:
pmap(named_list, ~names(list(...)))
# [[1]]
# [1] "one" "two" "three"
#
# [[2]]
# [1] "one" "two" "three"

( pmap(unname(named_list), function(x,y,z) x+y+z) 另一方面可以正常工作)

所以这将起作用:
pmap(named_list, ~ with(list(...), one + two + three))
# [[1]]
# [1] 6
#
# [[2]]
# [1] 6

使用 pyr::f
pryr使用 pryr::f 为函数定义提供了一个简洁的快捷方式:
library(pryr)
f(one + two + three)
# function (one, three, two)
# one + two + three

pmap(named_list, f(one + two + three))
# [[1]]
# [1] 6
#
# [[2]]
# [1] 6
#

但是在使用它时要小心,全局变量仍然会显示为参数,而函数会或不会包含在参数中,具体取决于它们的调用方式。例如 :
x <- 1
test <- mean
f(test(x) + lapply(iris,test2))
# function (iris, test2, x)
# test(x) + lapply(iris, test2)

所以这不是一个通用的方法,你应该只在简单的情况下使用它。第二种方法虽然有点黑客,但将是通用的。

此外 f是按字母顺序排列参数,这在处理命名列表时应该不是问题,但在处理部分命名列表时要小心。

关于r - 使用 purrr::pmap 处理 .f 列表名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51122773/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com