R脚本可运行的航班统计代码在R Markdown失效如何调整
故障原因
代码在R Markdown中运行失败的核心原因有两点:
- 表达式断行不规范:你在除法运算符
/后换行,把+单独放在新行开头。R Markdown的代码块解析逻辑和R控制台/普通R脚本不同,不会把行首单独的+识别为上一行的续行标记,会直接判定为语法错误。普通脚本能跑通只是碰巧符合控制台的续行识别规则,这种写法本身就存在兼容问题。 across()用法不严谨:across()设计目的是对多列批量执行相同操作,返回值为tibble类型,即使只传入1列,返回的也不是单值标量,在不同dplyr版本、不同运行上下文下很容易出现非预期结果。
修正方案
直接去掉冗余的续行+,替换掉不必要的across()写法即可,修正后的代码在R脚本和R Markdown中都能稳定运行:
library(nycflights13) library(dplyr) flights %>% group_by(carrier) %>% summarise( # 注:flights数据集中sched_dep_time无缺失值,每组总观测数n()就是计划航班总量,计算更简洁 cancel_pct = sum(is.na(dep_time)) / n() ) %>% arrange(desc(cancel_pct))
如果需要严格沿用原本的计算逻辑(比如适配sched_dep_time可能存在缺失的场景),可以用下面的写法,核心是避免单独把运算符放在行首、不要滥用across()计算单值汇总:
flights %>% group_by(carrier) %>% summarise( p = sum(is.na(dep_time)) / sum(!is.na(sched_dep_time)) ) %>% arrange(desc(p))
写R长表达式换行时,直接在运算符(比如
/、+、%>%)后面换行即可,不需要额外在新行开头加+这类续行标记,否则很容易在R Markdown、脚本批量执行等场景触发语法错误。
内容的提问来源于stack exchange,提问作者Keith Duong
相关产品推荐
相关产品推荐

