【发布时间】:2020-07-04 23:41:48
【问题描述】:
我正在使用rlang 学习准引用和引用。我的函数查看是否有任何forbidden_values 出现在任何提到的dataframe 变量selectlist 中,并将具有任何阳性结果的行标记为1,否则标记为0。
如何让 rlang 将未引用的输入解释到函数环境而不是全局环境中的参数选择列表?
当我提供值列表时,为什么我必须使用
!!而不是!!!?为什么我可以为匿名purrr 公式提供任何带有
dot-dot-dot运算符的函数?
此函数仅适用于变量名称以选择引号“”。
selectlist <- function(df, selectlist, forbidden_values){
enquos(selectlist)
enquos(forbidden_values)
df %>% mutate(is_injured = purrr::pmap_int(select(.,!!selectlist), ~any(c(...) %in% !!forbidden_values)))
}
作品
selectlist(expected, selectlist=c("PrimaryInjury","SecondaryInjury"),forbidden_values=c("Rust","Insect","Snow break"))
plantid year PrimaryInjury SecondaryInjury OtherInjury is_injured
1 1 1 <NA> <NA> <NA> 0
2 1 2 Insect <NA> <NA> 1
3 1 3 <NA> <NA> <NA> 0
4 2 1 <NA> <NA> <NA> 0
5 2 2 <NA> <NA> <NA> 0
6 2 3 Rust <NA> <NA> 1
7 3 1 <NA> <NA> <NA> 0
8 3 2 <NA> <NA> <NA> 0
9 3 3 <NA> <NA> <NA> 0
10 4 1 Rust <NA> <NA> 1
11 4 2 <NA> <NA> <NA> 0
12 4 3 Insect <NA> <NA> 1
13 5 1 Snow break <NA> <NA> 1
14 5 2 Rust <NA> <NA> 1
15 5 3 <NA> <NA> <NA> 0
不起作用
selectlist(expected, selectlist=c(PrimaryInjury,SecondaryInjury),forbidden_values=c("Rust","Insect","Snow break"))
拼接错误(dot_call(capture_dots, frame_env = frame_env, named = 命名,:找不到对象“PrimaryInjury”
感谢您的帮助...
示例数据框:预期
plantid <- rep(c(1,2,3,4,5), times=c(3,3,3,3,3))
year <- rep(1:3, length.out=length(plantid))
set.seed(42)
PrimaryInjury <- sample(c(NA,NA,NA,"Rust","Insect","Snow break"), 15, replace=TRUE)
SecondaryInjury <- rep(NA, length.out=length(plantid))
OtherInjury <- rep(NA, length.out=length(plantid))
expected <- data.frame(plantid,year,PrimaryInjury,SecondaryInjury, OtherInjury)
#All in selectlist must be characters.
expected$PrimaryInjury <- as.character(expected$PrimaryInjury)
expected$SecondaryInjury <- as.character(expected$SecondaryInjury)
expected$OtherInjury <- as.character(expected$OtherInjury)
expected的输出
structure(list(plantid = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4,
5, 5, 5), year = c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L,
3L, 1L, 2L, 3L), PrimaryInjury = c(NA, "Insect", NA, NA, NA,
"Rust", NA, NA, NA, "Rust", NA, "Insect", "Snow break", "Rust",
NA), SecondaryInjury = c(NA_character_, NA_character_, NA_character_,
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_,
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_,
NA_character_, NA_character_), OtherInjury = c(NA_character_,
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_,
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_,
NA_character_, NA_character_, NA_character_, NA_character_)), row.names = c(NA,
-15L), class = "data.frame")
【问题讨论】:
-
@RonakShah 包含预期输出的输入。
-
@RonakShah 我意识到我应该给它取个不同的名字!我的错,我已经包含了一个 dput 和创建示例 data.frame “预期”的代码。
标签: rlang dataframe purrr r dplyr purrr rlang tidyeval