我在 tibble 中有一個過濾器 quosures 串列列,我想根據現有的 tibble 和過濾器 quosures 創建另一個串列列:
library(tidyverse)
t1 <- tibble(x = letters)
tibble(filters = quos(x == "a", x == "b")) %>%
mutate(dat = map(filters, ~filter(t1, !!.x)))
#> Error in local_error_context(dots = dots, .index = i, mask = mask): promise already under evaluation: recursive default argument reference or earlier problems?
這不像我預期的那樣作業,可能是由于 和 之間的map互動。!!.x
使用輔助函式按預期作業:
helper_function <- function(dat_in, filters_quo_in) {
filter(dat_in, !!filters_quo_in)
}
tibble(filters = quos(x == "a", x == "b")) %>%
mutate(dat = map(filters, ~helper_function(t1, .x)))
#> # A tibble: 2 × 2
#> filters dat
#> <quos> <named list>
#> 1 x == "a" <tibble [1 × 1]>
#> 2 x == "b" <tibble [1 × 1]>
有沒有辦法讓我第一次嘗試在不使用輔助函式的情況下在 tidyverse 中作業?或者有沒有更好的方法將過濾器運算式的串列列同時傳遞給 tibble,并將結果作為另一個串列列回傳?
使用reprex v2.0.2創建于 2022-10-11
uj5u.com熱心網友回復:
根據這個執行緒https://community.rstudio.com/t/when-and-how-to-use-and-xy-pipe/101824/3
您目前也在嘗試使用“。” 參考被呼叫函式中的資料框(在 ~ 之后),這將不起作用,因為您現在有不同的背景關系 - 在 ~ 函式中的“。” 現在指第一個引數
這個執行緒更進一步。dplyr 管道資料 - `.` 和 `.x` 之間的區別
我找到了答案?purrr::map
如果是公式,例如 ~ .x 2,則將其轉換為函式。參考引數的方式有以下三種:
對于單引數函式,使用 .
對于兩個引數函式,使用 .x 和 .y
如需更多引數,請使用 ..1、..2、..3 等
tibble(filters = quos(x == "a", x == "b")) %>%
mutate(dat = map(filters, ~filter(t1, ..1)))
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/513411.html
