R Shiny如何将页面1生成的协整股票对列表作为页面2下拉菜单选项
你当前的代码问题出在Coin响应式表达式的返回值逻辑上:
- 你通过
print()函数输出结果,而R中print()的核心作用是控制台/界面打印,它的返回值会被隐式转换,配合ifelse()使用时,多元素的股票代码向量会被强制截断为单个值,所以你页面2的下拉框只能拿到第一个结果。 - 你把「协整配对成功的股票列表」和「无配对的提示文本」混合作为返回值,也会导致下拉菜单选项格式异常。
- 另外你原代码中
unique(CopairsR, CopairsC)的写法不符合函数参数规则,unique第二个参数是去重时的排除项,不是拼接的第二个向量,也会导致结果异常。
修改方案
1. 调整Coin响应式逻辑
删掉所有用print()做返回值的逻辑,改为返回结构化数据,同时保留你原来的判断规则:
Coin <- reactive({ req(input$Stock_Sym) Sym <- input$Stock_Sym # 不需要主动remove临时变量,reactive执行完会自动回收 if (Sym %in% Stseries$Stseries) { # 用list返回,status标记状态,data存有效配对数据,msg存展示文本 return(list( status = "invalid", msg = "标的股票为平稳序列,不存在协整关系" )) } else if (Sym %in% Useries$Useries) { Row <- as.data.frame(Jou[,Sym]) rownames(Row) <- rownames(Jou) Col <- as.data.frame(Jou[Sym,]) Col <- as.data.frame(t(Col)) rownames(Col) <- colnames(Jou) CopairsR <- rownames(Row)[Row[,1]=="Yes"] CopairsC <- rownames(Col)[Col[,1]=="Yes"] CopairsU <- unique(c(CopairsR, CopairsC)) if (length(CopairsU) == 0) { return(list( status = "empty", msg = "标的股票不存在任何协整配对标的" )) } else { return(list( status = "success", data = CopairsU, msg = CopairsU )) } } else if (Sym %in% Eseries$Eseries) { Row <- as.data.frame(Joe[,Sym]) rownames(Row) <- rownames(Joe) Col <- as.data.frame(Joe[Sym,]) Col <- as.data.frame(t(Col)) rownames(Col) <- colnames(Joe) CopairsR <- rownames(Row)[Row[,1]=="Yes"] CopairsC <- rownames(Col)[Col[,1]=="Yes"] CopairsE <- unique(c(CopairsR, CopairsC)) if (length(CopairsE) == 0) { return(list( status = "empty", msg = "标的股票不存在任何协整配对标的" )) } else { return(list( status = "success", data = CopairsE, msg = CopairsE )) } } else { return(list( status = "invalid", msg = "标的股票观测值不足,或不属于一阶单整序列" )) } })
2. 修改页面1的输出逻辑
单独处理页面1的打印展示,不影响响应式返回值:
output$`Possible Pairs` <- renderPrint({ coin_res <- Coin() coin_res$msg })
3. 调整页面2下拉菜单更新逻辑
根据Coin的返回状态动态填充选项,无匹配时显示提示项:
# Input - Pair Selection observe({ coin_res <- Coin() if (coin_res$status == "success") { choices <- coin_res$data } else { choices <- c("无可用协整配对标的" = "") } updateSelectInput(session, "Pair_Sym" , choices = choices) })
修改后即可完整加载所有协整配对股票,同时兼容无匹配标的的场景。
内容的提问来源于stack exchange,提问作者SivaR
相关产品推荐
相关产品推荐

