在 lapply 可选参数中两次使用 .data 代词

Using .data pronoun twice in lapply optional arguments

我想使用 lapply 函数将列表项传递给 FUN 中的两个参数。

例如,假设:

> lapply(state.abb, paste, c(.data, 2))
[[1]]
[1] "AL 2"

[[2]]
[1] "AK 2"

在这里,我可以将列表参数 .data 和 2 传递给 paste 函数。但是在我的应用程序中,我想将 .data 传递给两个 paste 参数。在我的想象中,这将是代码和输出:

>lapply(state.abb, paste, c(.data, .data))
[[1]]
[1] "AL AL"

[[2]]
[1] "AK AK"

但我得到的却是

> lapply(state.abb, paste, c(.data, .data))
[[1]]
[1] "AL "

[[2]]
[1] "AK "

可以 在这种情况下再次提供 state.abb ,但在我的实际用例中,这是一个更大的数据集的一部分,我试图避免尽可能命名对象。

非常感谢帮助!

您可以使用匿名函数:

lapply(state.abb, function(x) paste(x, x))

OR paste 然后将其设为列表。

as.list(paste(state.abb, state.abb))

.data 代词是一个 tidyverse (dplyr/ggplot2) 的东西。它不适用于 lapply 等基本函数。 (事实上​​ ,如果您 运行 没有加载 dplyrggplot2 的代码,您应该会收到“找不到对象”错误。如果有任何其他函数使用它,.data 基本上定义为一个空列表,因此它不会为您做任何事情。所以这些都是完全一样的

lapply(state.abb, paste, c(.data, 2))
lapply(state.abb, paste, c(list(), 2))
lapply(state.abb, paste, list(2))

如果你想在 lapply 中多次使用相同的参数,那么你需要编写自己的函数

lapply(state.abb, function(x) paste(x, x))

或者您可以使用 purrr::map 函数,并使用 .x 为数据使用函数的公式语法

purrr::map(state.abb, ~paste(.x, .x))

不一定比上面的解决方案更好,但另一个:

Map(function(state.abb, i) paste(i, state.abb), state.abb, state.abb)