R Shiny平稳性检验勾选配置与多变量结果输出实现问题
R Shiny多变量平稳性测试实现方案
错误原因排查
你遇到的subset2: attempt to select less than one element in integerOneIndex错误,根源是使用df[[input$selected_var]]这种双括号语法取多个变量,双括号仅支持提取单个元素,传入多变量向量时就会触发索引错误。
实现逻辑
- 测试逻辑封装为独立响应式函数,返回结构化数据框,可直接调用到Rnw报告中
- 遍历选中变量逐个执行测试,避免多变量索引报错
- 测试结果统一整理为长表结构,同时保留原始测试对象供后续分析使用
完整实现代码
library(shiny) library(readxl) library(tseries) library(urca) library(DT) ui <- fluidPage( fileInput("excel_file", "上传Excel文件", accept = c(".xlsx", ".xls")), # 测试类型复选框 checkboxGroupInput("test_types", "选择平稳性测试类型", choices = c("ADF", "PP", "KPSS-TREND"), selected = "ADF"), # 动态生成的多变量选择框 uiOutput("var_selector"), # 结果输出 DTOutput("test_results"), # 原始测试结果输出(可选,用于调试) verbatimTextOutput("raw_results") ) server <- function(input, output) { # 读取上传的Excel数据 raw_data <- reactive({ req(input$excel_file) read_excel(input$excel_file$datapath) }) # 动态生成变量选择器 output$var_selector <- renderUI({ req(raw_data()) checkboxGroupInput("selected_vars", "选择要测试的变量", choices = colnames(raw_data()), selected = colnames(raw_data())[1]) }) # 核心响应式平稳性测试函数,返回结果可直接用于Rnw报告 stationarity_test_results <- reactive({ req(raw_data(), input$selected_vars, input$test_types) df <- raw_data() test_res <- list() # 遍历所有选中的变量 for (var in input$selected_vars) { var_data <- df[[var]] # 遍历所有选中的测试类型 for (test in input$test_types) { if (test == "ADF") { res <- adf.test(var_data) res_row <- data.frame( 变量名 = var, 测试类型 = test, 统计量 = res$statistic, P值 = res$p.value, 滞后阶数 = res$parameter, 检验结论 = ifelse(res$p.value < 0.05, "平稳*", "非平稳"), 原始结果 = I(list(res)) # 保留原始测试对象 ) } else if (test == "PP") { res <- pp.test(var_data) res_row <- data.frame( 变量名 = var, 测试类型 = test, 统计量 = res$statistic, P值 = res$p.value, 截断滞后参数 = res$parameter, 检验结论 = ifelse(res$p.value < 0.05, "平稳*", "非平稳"), 原始结果 = I(list(res)) ) } else if (test == "KPSS-TREND") { res <- ur.kpss(var_data, type = "trend") res_stat <- res@teststat res_cv <- res@cval["5pct"] res_row <- data.frame( 变量名 = var, 测试类型 = test, 统计量 = res_stat, 5%临界值 = res_cv, 检验结论 = ifelse(res_stat < res_cv, "平稳*", "非平稳"), 原始结果 = I(list(res)) ) } test_res[[length(test_res) + 1]] <- res_row } } # 合并为数据框返回 do.call(rbind, test_res) }) # 输出表格化测试结果 output$test_results <- renderDT({ req(stationarity_test_results()) # 隐藏原始结果列用于展示 display_df <- stationarity_test_results()[, -which(colnames(stationarity_test_results()) == "原始结果")] datatable(display_df, rownames = FALSE) }) # 可选:输出原始测试结果供查看 output$raw_results <- renderPrint({ req(stationarity_test_results()) stationarity_test_results()$原始结果 }) } shinyApp(ui, server)
Rnw报告集成方法
在生成Rnw报告的downloadHandler中,直接调用stationarity_test_results()即可获取所有测试数据,示例如下:
output$download_report <- downloadHandler( filename = "平稳性测试报告.pdf", content = function(file) { # 传递测试结果到Rnw环境 test_res <- stationarity_test_results() knitr::knit2pdf("report_template.Rnw", output = file) } )
在Rnw模板中可以直接调用test_res变量遍历生成测试结果表格、打印原始测试输出。
内容的提问来源于stack exchange,提问作者Maria Ruxandra
相关产品推荐
相关产品推荐

