【问题标题】:Giving user defined functions non-quoted arguments in purrr在 purrr 中为用户定义的函数提供非引用参数
【发布时间】:2020-07-04 23:41:48
【问题描述】:

我正在使用 学习准引用和引用。我的函数查看是否有任何forbidden_values 出现在任何提到的 变量selectlist 中,并将具有任何阳性结果的行标记为1,否则标记为0

  • 如何让 rlang 将未引用的输入解释到函数环境而不是全局环境中的参数选择列表?

  • 当我提供值列表时,为什么我必须使用 !! 而不是 !!!

  • 为什么我可以为匿名 公式提供任何带有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


【解决方案1】:

如果可以单独传递不带引号的变量,我们可以使用三个点

selectlist <- function(df, forbidden_values, ...){

    df %>% mutate(is_injured = purrr::pmap_int(select(.,...), 
                               ~any(c(...) %in% forbidden_values)))
}

selectlist(expected, forbidden_values= c("Rust","Insect","Snow break"), 
                      PrimaryInjury, SecondaryInjury)


#   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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 2023-01-29
    • 1970-01-01
    • 2021-09-17
    相关资源
    最近更新 更多