小编Ild*_*ler的帖子

具有ifelse行为的magrittr管道(%>%)的原因?

我正在使用带有管道的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放在花括号中的想法,在使用简单.或使用.表达式/函数调用之间没有区别,这是我的问题的要点.

r magrittr

8
推荐指数
1
解决办法
499
查看次数

同时使用data.table和tidy eval:为什么group by不能按预期工作,为什么要插入?

我没有一个紧迫的用例,但想了解整齐的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)

r data.table tidyeval rlang

5
推荐指数
1
解决办法
403
查看次数

标签 统计

r ×2

data.table ×1

magrittr ×1

rlang ×1

tidyeval ×1