将管道运算符与 rbind 结合使用时,为什么 R studio 会标记意外标记错误?

Why is R studio flagging an unexpected token error when combining pipe operator with rbind?

下面的示例代码工作正常,在计算出现次数(“Status_1”事件受“Status_2”约束)时,创建一个枢轴table这些事件,并在数据透视表的底部添加一个总计行 table:

library(dplyr)
library(tidyverse)

mydat <- 
  data.frame(
    Period = c(1, 2, 3, 1, 2, 3, 1, 2),
    ID = c(115,115,115,88,88,88,100,100),
    Status_1 = c('P01','P02','P03','P01','P02','P03','P01','P04'),
    Status_2 = c('Open','Open','Closed','Open','Open','Closed','Open','Open')
  )

counts <-
  mydat %>%
  group_by(Period,Status_1) %>%
  summarize(Status_1_cnt = n_distinct(ID[Status_2 == "Open"])) %>%
  ungroup()

mydatTable <- 
  pivot_wider(counts, 
              id_cols = Status_1, 
              names_from = Period, 
              values_from = Status_1_cnt, 
              values_fill = list(Status_1_cnt = 0)
              ) %>%
  bind_rows(summarise_all(., ~if(is.numeric(.)) sum(.) else "Total"))
mydatTable

> mydatTable
# A tibble: 5 x 4
  Status_1   `1`   `2`   `3`
  <chr>    <int> <int> <int>
1 P01          3     0     0
2 P02          0     2     0
3 P04          0     1     0
4 P03          0     0     0
5 Total        3     3     0

但是,RStudio 在 rbind() 行中标记了一个“意外标记”错误,如底部的 RStudio 屏幕截图所示。我已经在 Google 和 Stack Overflow 中研究了这种错误,并且这个 problem/solutions 有很多不同的风格。如果解决方案是更新 RStudio,所有搜索都会显示“要更新 RStudio,只需 运行 RStudio,然后转到顶部菜单栏中的帮助菜单(而不是右下象限中的帮助选项卡)。在帮助中菜单,select 检查更新。”...但是我的 RStudio 版本在“帮助”菜单中没有“检查更新”。

也许下面的 rbind() 行有问题,是否有更好的方法来添加总计行?

有什么解决这个问题的建议吗?

看起来 RStudio 正在错误地解析 if。由于 if 只是一个由解析器进行特殊处理的函数,您可以将其编写为标准格式,警告消失:

bind_rows(summarise_all(., ~ `if`(is.numeric(.), sum(.), "Total")))

另一个修复方法是在整个 if 调用周围放置括号:

bind_rows(summarise_all(., ~(if(is.numeric(.)) sum(.) else "Total")))

当然你可以编写自己的函数来处理它,并使用它:

kluge <- function(x) 
  if (is.numeric(x)) sum(x) else "Total"

mydatTable <- 
  pivot_wider(counts, 
              id_cols = Status_1, 
              names_from = Period, 
              values_from = Status_1_cnt, 
              values_fill = list(Status_1_cnt = 0)
  ) %>%
  bind_rows(summarise_all(., ~kluge(.)))

我可能更愿意忽略警告而不是使用这些修复中的任何一个。