我正在使用带有管道的ifelse,我在条件和ifelse分支中使用转发结果.下面是一个简化版本:似乎ifelse + pipe只处理条件不同于.放在花括号内的情况.
library("magrittr")
FALSE %>% ifelse(., 'true', 'false')
#> [1] "false"
FALSE %>% ifelse(. == TRUE, 'true', 'false')
#> Error in ifelse(., . == TRUE, "true", "false"): unused argument ("false")
FALSE %>% {ifelse(. == TRUE, 'true', 'false')}
#> [1] "false"
Run Code Online (Sandbox Code Playgroud)
我最初的目标:
library("magrittr")
NULL %>% ifelse(is.null(.), "", as.character(.))
#> Error in ifelse(., is.null(.), "", as.character(.)): unused argument (as.character(.))
NULL %>% {ifelse(is.null(.), "", as.character(.))}
#> [1] ""
Run Code Online (Sandbox Code Playgroud)
使用{}对我来说足够好,但我想了解这种行为的原因.
编辑:
虽然这个问题讨论了一个相关的主题,我最初看到将ifelse放在花括号中的想法,在使用简单.或使用.表达式/函数调用之间没有区别,这是我的问题的要点.
我没有一个紧迫的用例,但想了解整齐的eval和data.table如何协同工作.
我有替代解决方案,所以我最感兴趣的是为什么,因为我希望能够更好地理解整齐的eval,这将有助于我在各种各样的用例中使用.
如何使用group by进行data.table +整理eval工作?
在以下示例中,我使用了rlang的开发版本.
我根据Stefan F的答案和我的进一步探索更新了我的原始问题:我不再认为插入的〜是问题的重要部分,因为它也存在于dplyr代码中,但我有一个特定的代码:data.table + group by + quo我不明白为什么不起作用.
# setup ------------------------------------
suppressPackageStartupMessages(library("data.table"))
suppressPackageStartupMessages(library("rlang"))
suppressPackageStartupMessages(library("dplyr"))
#> Warning: package 'dplyr' was built under R version 3.5.1
dt <- data.table(
num_campaign = 1:5,
id = c(1, 1, 2, 2, 2)
)
df <- as.data.frame(dt)
# original question ------------------------
aggr_expr <- quo(sum(num_campaign))
q <- quo(dt[, aggr := !!aggr_expr][])
e <- quo_get_expr(q)
e
#> dt[, `:=`(aggr, ~sum(num_campaign))][]
dt[, `:=`(aggr, ~sum(num_campaign))][]
#> Error in `[.data.table`(dt, , `:=`(aggr, ~sum(num_campaign))): RHS of …Run Code Online (Sandbox Code Playgroud)