将管道运算符与 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(.)))
我可能更愿意忽略警告而不是使用这些修复中的任何一个。
下面的示例代码工作正常,在计算出现次数(“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(.)))
我可能更愿意忽略警告而不是使用这些修复中的任何一个。