You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

错误原因分析

  1. 错误提示Error in base::union(x, y, ...) : unused argument (list()),说明在lazy加载过程中,pivottabler内部调用union时传入了额外的list()参数,而base::union仅接受两个向量参数,不支持额外参数。
  2. 代码直接在包的顶级环境中执行所有透视表生成逻辑,包安装时会自动运行顶级代码,导致pivottabler的内部操作在lazy加载环境下触发冲突,尤其是使用PivotFilterOverrides的部分。
  3. 不符合R包开发规范:包的顶级代码不应包含直接的业务执行逻辑(如读取文件、生成报表),此类操作需封装到函数中。

解决方法

方法1:重构代码结构(推荐)

将所有执行逻辑封装到函数中,避免顶级代码自动运行:

  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
相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 14:19:50