我有一个棘手的问题访问列表的字符串值作为参数传递给呼噜声功能。
我的目标是连接两个向量(在一个输出文件名使用),我投入一个输入列表中的字符串元素的所有排列:
target.labels <- c("Prefix_A", "Prefix_B")
features.sets <- c("Suffix_X", "Suffix_Y")
input.list <- expand.grid(x=target.labels, y=features.sets)
预期的结果应该是这样的:
"Prefix_A-Suffix_X" "Prefix_B-Suffix_X" "Prefix_A-Suffix_Y" "Prefix_B-Suffix_Y"
下面是我的尝试:
library(dplyr)
library(purrr)
fun1 <- function(x,y) { paste0(c(x, y), collapse = "-") }
fun2 <- function(x,y) { paste(x, y, sep = "-") }
fun3 <- function(x,y) { glue::glue("x = {x}, y = {y}") }
input.list %>% pmap_chr(fun1)
## [1] "1-1" "2-1" "1-2" "2-2"
input.list %>% pmap_chr(fun2)
## [1] "1-1" "2-1" "1-2" "2-2
input.list %>% pmap_chr(fun3)
## [1] "x = 1, y = 1" "x = 2, y = 1" "x = 1, y = 2" "x = 2, y = 2"
input.list %>% pmap_chr(~paste(.x, .y, sep = "-"))
## [1] "1-1" "2-1" "1-2" "2-2"
正如你所看到的,呼噜声:: PMAP功能只检索元素的索引值而不是字符串值。在另一边,它可能不是特定于呼噜声的应用功能表现出了同样的问题:
mapply(fun1, input.list$x, input.list$y)
## [1] "1-1" "2-1" "1-2" "2-2"
一个预感是,不知何故,隐藏的C()在paste0()的函数或糊状()防止字符串值的访问 - 但只有在与呼噜声组合:PMAP,不发出呼噜声,MAP2!
所以这工作原理:
map2_chr(.x = input.list$x, .y = input.list$y, ~paste(.x, .y, sep = "-"))
## [1] "Prefix_A-Suffix_X" "Prefix_B-Suffix_X" "Prefix_A-Suffix_Y"
## [4] "Prefix_B-Suffix_Y"
我的直觉是,这个问题可能是与NSE(非标准评价),但我因为呼噜声就不能弄清楚:MAP2按预期工作。
我将是一个很好的解释为什么出现这种情况表示感谢 - 以及如何使其与发出咕噜声工作:PMAP。
基础功能expand.grid
是把你列到的因素。既然你已经在使用tidyverse功能,使用相当的整齐,而不是crossing
input.list <- crossing(x=target.labels, y=features.sets)
然后fun1
或fun1
应该能正常运行。用因子的问题是它们基本上存储与R整数所以他们更LIKEY转换为数字比字符。
在这里,expand.grid
列可以被改变,如果我们使用character
到stringsAsFactors = FALSE
类,然后用pmap
可以paste
每一行中的元素
library(purrr)
input.list <- expand.grid(x=target.labels, y=features.sets, stringsAsFactors = FALSE)
pmap_chr(input.list, paste, collapse="-")
#[1] "Prefix_A Suffix_X" "Prefix_B Suffix_X" "Prefix_A Suffix_Y" "Prefix_B Suffix_Y"