Mac Sequoia环境下R包pivottablesmodels4安装lazy加载错误求助
问题排查:R包lazy加载失败错误解决
项目背景
我的项目旨在计算瓦赫宁根市9个邮编(6701-6709)区域前往距离该市1.2-3.2km的6个休闲区的访问量总和与预期停留时长(expected_visiting_duration),数据来自含26945条记录、21个变量的fdata152.xlsx文件。基于pivottabler包创建了两个R项目:pivottablesmodels3.Rproj和pivottablesmodels4.Rproj,二者共用同一数据文件。其中pivottablesmodels3可正常完成Build-Clean和Install;pivottablesmodels4能正确生成包含“访问量占总计百分比”的4张透视表,但执行Build-Clean和Install时出现错误。
错误信息
==> R CMD INSTALL --preclean --no-multiarch --with-keep.source pivottablesmodels4 installing to library ‘/Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/library’ installing source package ‘pivottablesmodels4’ ... ** using staged installation ** R ** byte-compile and prepare package for lazy loading [1] "Sum of number of visits per location" [1] "calculate the total of expected_visiting_duration" [1] "total costs" [1] "additional variables: distance, total fuel cost, total activities cost" [1] "% number of visits Grand total" Error in base::union(x, y, ...) : unused argument (list()) Calls: ... -> envlist -> -> union -> union.default Execution halted ERROR: lazy loading failed for package ‘pivottablesmodels4’ removing ‘/Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/library/pivottablesmodels4’
问题代码
# 项目目标:估算瓦赫宁根市9个邮编区域(6701-6709)前往6个距离该市1.20-3.30km的休闲区的访问量总和及预期停留时长 # 数据来自ACRER模型结果,存储于fdata152.xlsx文件 library(openxlsx) library(pivottabler) library(devtools) library(R6) fdata152 <- read.xlsx( "inst/fdata152.xlsx",sheet = 1,startRow = 1,colNames = TRUE,rowNames = FALSE,rows = NULL,cols = NULL) wb <- createWorkbook(creator = "Georgios Martakis", title = "Wageningen_crosstables4") print("Sum of number of visits per location") pt <- PivotTable$new() pt$addData(fdata152) pt$addRowDataGroups("recreation_areas",header = "recreation areas", totalCaption = "All_recreation_areas", styleDeclarations = list("color" = "white", "font-weight" = "bold","background-color" = "blue")) pt$addColumnDataGroups("zip_code",totalCaption = "All_zip_codes", styleDeclarations = list("color" = "white", "font-weight" = "bold","background-color" = "blue")) pt$addColumnDataGroups("Time_available_per_time_segment",totalCaption = "All_Time_segments",styleDeclarations = list("color" = "black", "font-weight" = "bold","background-color" = "red")) pt$defineCalculation(calculationName = "Count_hgpID", summariseExpression = "n()", format = "%.2f", visible = TRUE) pt$defineCalculation(calculationName = "number_of_visits",summariseExpression = "sum(number_of_visits)",format = "%.2f") pt$defineCalculation(calculationName = "mean_number_of_visits",summariseExpression = "mean(number_of_visits)",format = "%.2f") pt$defineCalculation(calculationName = "median_number_of_visits",summariseExpression = "median(number_of_visits)",format = "%.2f") pt$setRowDataGroupHeader(levelNumber = 1, header = "Recreation areas") pt$renderPivot(exportOptions = list(skipNA = TRUE, skipNaN = TRUE), showRowGroupHeaders = TRUE) pt$saveHtml("extdata/number_of_visits.html") addWorksheet(wb, "number_of_visits", gridLines = openxlsx_getOp("gridLines", TRUE)) pt$writeToExcelWorksheet(wb, wsName = "number_of_visits",topRowNumber = 1, leftMostColumnNumber = 1,outputValuesAs = "formattedValueAsNumber",outputHeadingsAs = "formattedValueAsText", applyStyles = TRUE, mapStylesFromCSS = TRUE) saveWorkbook(wb, "extdata/Wageningen_crosstables4.xlsx", overwrite = TRUE) rm(pt) print("calculate the total of expected_visiting_duration") pt <- PivotTable$new() pt$addData(fdata152) pt$addRowDataGroups("recreation_areas",header = "recreation areas",totalCaption = "All_recreation_areas", styleDeclarations = list("color" = "white", "font-weight" = "bold","background-color" = "blue")) pt$addColumnDataGroups("zip_code",totalCaption = "All_zip_codes", styleDeclarations = list("color" = "white", "font-weight" = "bold","background-color" = "blue")) pt$addColumnDataGroups("Time_available_per_time_segment",totalCaption = "All_Time_segments", styleDeclarations = list("color" = "black", "font-weight" = "bold","background-color" = "red")) pt$defineCalculation(calculationName = "Count_hgpID", summariseExpression = "n()", format = "%.2f", visible = TRUE) pt$defineCalculation(calculationName = "total_exp_visit_duration", summariseExpression = "sum(expected_visiting_duration)",format = "%.2f") pt$defineCalculation(calculationName = "mean_exp_visit_duration", summariseExpression = "mean(expected_visiting_duration)",format = "%.2f") pt$defineCalculation(calculationName = "median_exp_visit_duration",summariseExpression = "median(expected_visiting_duration)",format = "%.2f") pt$setRowDataGroupHeader(levelNumber = 1, header = "Recreation areas") pt$renderPivot(exportOptions = list(skipNA = TRUE, skipNaN = TRUE),showRowGroupHeaders = TRUE) pt$saveHtml("extdata/exp_visiting_duration.html") addWorksheet(wb,"exp_vis_dur_time_segment") pt$writeToExcelWorksheet(wb = wb, wsName = "exp_vis_dur_time_segment", topRowNumber = 1, leftMostColumnNumber = 1,outputValuesAs = "formattedValueAsNumber", applyStyles = TRUE, mapStylesFromCSS = TRUE) saveWorkbook(wb, "extdata/Wageningen_crosstables4.xlsx", overwrite = TRUE) rm(pt) print("total costs") print("additional variables: distance, total fuel cost, total activities cost") pt <- PivotTable$new() pt$addData(fdata152) pt$addRowDataGroups("recreation_areas",header = "recreation areas",totalCaption = "All_recreation_areas", styleDeclarations = list("color" = "white", "font-weight" = "bold","background-color" = "blue")) pt$addColumnDataGroups("zip_code",totalCaption = "All_zip_codes", styleDeclarations = list("color" = "white", "font-weight" = "bold","background-color" = "blue")) pt$addColumnDataGroups("Time_available_per_time_segment",totalCaption = "All_Time_segments", styleDeclarations = list("color" = "black", "font-weight" = "bold","background-color" = "red")) pt$defineCalculation(calculationName = "distances_km",summariseExpression = "mean(as.numeric(distances_km))", format = "%.2f") pt$defineCalculation(calculationName = "Count_hgpID", summariseExpression = "n()", format = "%.2f", visible = TRUE) pt$defineCalculation(calculationName = "total_fuel_cost", summariseExpression = "mean(as.numeric(fuel_cost_total))",format = "%.2f") pt$defineCalculation(calculationName = "T_activ_costs",summariseExpression = "mean(as.numeric(total_activities_costs))",format = "%.2f ") pt$defineCalculation(calculationName = "N_of_visits", summariseExpression = "sum(number_of_visits)", format = "%.2f") pt$defineCalculation(calculationName = "mean_of_visits", summariseExpression = "mean(number_of_visits)", format = "%.2f") pt$defineCalculation(calculationName = "N_of_duration", summariseExpression = "sum(number_of_visits)", format = "%.2f") pt$defineCalculation(calculationName = "mean_duration", summariseExpression = "mean(expected_visiting_duration)",format = "%.2f") pt$renderPivot(exportOptions = list(skipNA = TRUE, skipNaN = TRUE),showRowGroupHeaders = TRUE) pt$saveHtml("extdata/total_cost.html") addWorksheet(wb, "total_costs") pt$writeToExcelWorksheet(wb = wb, wsName = "total_costs",topRowNumber = 1, leftMostColumnNumber = 1,outputValuesAs = "formattedValueAsNumber",applyStyles = TRUE) saveWorkbook(wb, "extdata/Wageningen_crosstables4.xlsx", overwrite = TRUE) rm(pt) print("percent of the expected_visiting_duration per Grand total") pt <- PivotTable$new() pt$addData(fdata152) pt$addRowDataGroups("recreation_areas",header = "recreation areas",totalCaption = "All_recreation_areas", styleDeclarations = list("color" = "white", "font-weight" = "bold","background-color" = "blue")) pt$addColumnDataGroups("zip_code",totalCaption = "All_zip_codes", styleDeclarations = list("color" = "white", "font-weight" = "bold","background-color" = "blue")) pt$addColumnDataGroups("Time_available_per_time_segment",totalCaption = "All_Time_segments", styleDeclarations = list("color" = "black", "font-weight" = "bold","background-color" = "red")) pt$defineCalculation(calculationName = "Count_hgpID", summariseExpression = "n()", format = "%.2f", visible = TRUE) pt$defineCalculation(calculationName = "Sum_expected_visiting_duration", summariseExpression = "sum(expected_visiting_duration)", format = "%.2f", visible = TRUE) pt$defineCalculation(calculationName = "mean_expected_visiting_duration", summariseExpression = "mean(expected_visiting_duration)", format = "%.2f", visible = TRUE) filterOverrides <- PivotFilterOverrides$new(pt, removeAllFilters = TRUE) pt$defineCalculation(calculationName = "GrandTotalRecreationAreas", filters = filterOverrides, summariseExpression = "sum(expected_visiting_duration)", format = "%.2f", caption = "GrandTotalRecreationAreas") pt$defineCalculation(calculationName = "Exp_vs_dur_%_GT",type = "calculation", basedOn = c("Sum_expected_visiting_duration","GrandTotalRecreationAreas"),calculationExpression = "values$Sum_expected_visiting_duration/values$GrandTotalRecreationAreas * 100",caption = "% of All", format = "%.2f") pt$renderPivot(exportOptions = list(skipNA = TRUE, skipNaN = TRUE),showRowGroupHeaders = TRUE) pt$saveHtml("extdata/exp_visiting_duration_Grand_total.html") addWorksheet(wb, "Exp_vs_dur_%_GT") pt$writeToExcelWorksheet(wb = wb, wsName = "Exp_vs_dur_%_GT",topRowNumber = 1, leftMostColumnNumber = 1,outputValuesAs = "formattedValueAsNumber",applyStyles = TRUE) saveWorkbook(wb, file = 'extdata/Wageningen_crosstables4.xlsx', overwrite = TRUE) rm(pt) rm(wb)
错误原因分析
- 错误提示
Error in base::union(x, y, ...) : unused argument (list()),说明在lazy加载过程中,pivottabler内部调用union时传入了额外的list()参数,而base::union仅接受两个向量参数,不支持额外参数。 - 代码直接在包的顶级环境中执行所有透视表生成逻辑,包安装时会自动运行顶级代码,导致
pivottabler的内部操作在lazy加载环境下触发冲突,尤其是使用PivotFilterOverrides的部分。 - 不符合R包开发规范:包的顶级代码不应包含直接的业务执行逻辑(如读取文件、生成报表),此类操作需封装到函数中。
解决方法
方法1:重构代码结构(推荐)
将所有执行逻辑封装到函数中,避免顶级代码自动运行:
- 在包的
R/目录下创建generate_pivots.R文件,内容如下:
generate_pivots <- function() { library(openxlsx) library(pivottabler) # 读取包内数据文件 fdata152 <- read.xlsx( system.file("extdata", "fdata152.xlsx", package = "pivottablesmodels4"), sheet = 1, startRow = 1, colNames = TRUE, rowNames = FALSE ) wb <- createWorkbook(creator = "Georgios Martakis", title = "Wageningen_crosstables4") # 第一个透视表:访问量统计 print("Sum of number of visits per location") pt <- PivotTable$new() pt$addData(fdata152) pt$addRowDataGroups("recreation_areas",header = "recreation areas", totalCaption = "All_recreation_areas", styleDeclarations = list("color" = "white", "font-weight" = "bold","background-color" = "blue")) pt$addColumnDataGroups("zip_code",totalCaption = "All_zip_codes", styleDeclarations = list("color" = "white", "font-weight" = "bold","background-color" = "blue")) pt$addColumnDataGroups("Time_available_per_time_segment",totalCaption = "All_Time_segments",styleDeclarations = list("color" = "black", "font-weight" = "bold","background-color" = "red")) pt$defineCalculation(calculationName = "Count_hgpID", summariseExpression = "n()", format = "%.2f", visible = TRUE) pt$defineCalculation(calculationName = "number_of_visits",summariseExpression = "sum(number_of_visits)",format = "%.2f") pt$defineCalculation(calculationName = "mean_number_of_visits",summariseExpression = "mean(number_of_visits)",format = "%.2f") pt$defineCalculation(calculationName = "median_number_of_visits",summariseExpression = "median(number_of_visits)",format = "%.2f") pt$setRowDataGroupHeader(levelNumber = 1, header = "Recreation areas") pt$renderPivot(exportOptions = list(skipNA = TRUE, skipNaN = TRUE), showRowGroupHeaders = TRUE) html_path <- system.file("extdata", "number_of_visits.html", package = "pivottablesmodels4") pt$saveHtml(html_path) addWorksheet(wb, "number_of_visits", gridLines = openxlsx_getOp("gridLines", TRUE)) pt$writeToExcelWorksheet(wb, wsName = "number_of_visits",topRowNumber = 1, leftMostColumnNumber = 1,outputValuesAs = "formattedValueAsNumber",outputHeadingsAs = "formattedValueAsText", applyStyles = TRUE, mapStylesFromCSS = TRUE) rm(pt) # 第二个透视表:预期停留时长统计 print("calculate the total of expected_visiting_duration") pt <- PivotTable$new() pt$addData(fdata152) pt$addRowDataGroups("recreation_areas",header = "recreation areas",totalCaption = "All_recreation_areas", styleDeclarations = list("color" = "white", "font-weight" = "bold","background-color" = "blue")) pt$addColumnDataGroups("zip_code",totalCaption = "All_zip_codes", styleDeclarations = list("color" = "white", "font-weight" = "bold","background-color" = "blue")) pt$addColumnDataGroups("Time_available_per_time_segment",totalCaption = "All_Time_segments", styleDeclarations = list("color" = "black", "font-weight
相关产品推荐
相关产品推荐

