RStudio knit至HTML时冻结,计算密集型命令触发问题求助
解决RStudio Knit时因计算密集型操作冻结的建议
针对distHaversine的性能优化
- 移除
rowwise(),改用向量化计算:rowwise()会逐行处理数据,数据集较大时速度极慢。distHaversine本身支持矩阵输入,直接传入经纬度列组成的矩阵即可大幅提升效率:
may_to_october_behavior <- trips_w_stations %>% filter(month %in% c('May','June','July','August','September','October')) %>% mutate(trip_distance = distHaversine( matrix(c(start_lng, start_lat), ncol=2), matrix(c(end_lng, end_lat), ncol=2), r=6378137 )) %>% filter(trip_distance > 0) %>% group_by(customer_type, bike_type) %>% summarize(mean_trip_length = mean(trip_length, na.rm=TRUE), mean_distance_travelled_m = mean(trip_distance, na.rm=TRUE), ride_count = n_distinct(ride_id)) %>% mutate(avg_mph = (mean_distance_travelled_m/mean_trip_length)*2.2369)
- 简化月份过滤逻辑:用
%in%替代多个|,代码更简洁且性能更优。
针对difftime的优化
- 改用lubridate的
time_length函数:lubridate包的time_length比基础包difftime更高效,语法也更简洁:
trips_2 <- trips_1 %>% mutate( weekday = wday(started_at, label = TRUE, abbr = FALSE), month = month(started_at, label = TRUE, abbr = FALSE), week = strftime(started_at, format = "%V"), day = day(started_at), start_hour = hour(started_at), trip_length = time_length(ended_at - started_at, unit = "seconds") )
RStudio与Knit流程的优化
- 禁用自动保存和实时预览:Knit前在
Tools > Global Options > Saving中关闭自动保存,同时选择在浏览器而非RStudio预览窗格打开结果,减少资源占用。 - 启用
knitr缓存:对计算密集型代码块启用缓存,避免每次Knit重复计算:
```{r cache=TRUE, cache.lazy=FALSE} # 此处放置计算密集型代码(如上述数据集处理代码)
- **更新软件与依赖包**:确保使用最新版本的R、RStudio以及tidyverse、geosphere等依赖包,新版本通常会修复性能问题与bug。 - **检查数据规模并抽样测试**:确认当前数据集行数,若数据量过大(百万级以上),可先抽样验证代码逻辑,再处理全量数据;或改用`data.table`替代`dplyr`进行更高效的大数据处理。 --- 内容的提问来源于stack exchange,提问作者Pat Tarantino
相关产品推荐
相关产品推荐

