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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 10:45:04