基于先前无功输出的新下拉输入 - R Shiny

New dropdown inputs based on previous reactive Output - R Shiny

这是我的第一个 Shiny 应用程序。

我正在尝试构建一个仪表板,用于查找协整的股票并使用它们预测价格。

注意 - 我知道页码在代码中并不重要,我仅将其用作下面的参考。

仪表盘的流程如下-

第 1 页 - Select 股票(例如股票“A”)-> 绘图 -> 结构断裂 -> 单位根 -> 查找协整对

第 1 页没有问题。

第 2 页 -> Select 与股票 A 协整的股票(由第 1 页的协整对填充的下拉列表。也应允许 0 个对象,因为该股票可能不与任何股票协整)

问题 - 如何从第 1 页检索协整对列表并将其用作第 2 页下拉菜单的输入?

下面是创建协整对列表的代码。我使用 renderPrint 在第 1 页显示输出。

Coin <- reactive({
    req(input$Stock_Sym)
    Sym <- input$Stock_Sym
    remove(Row)
    remove(Col)
    if (Sym %in% Stseries$Stseries) {
        print("The Stock is stationary and cannot have cointegrating relationship")
    } 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 <- c(unique(CopairsR, CopairsC))
        CopairsU <- ifelse(length(CopairsU)==0, print("The Stock is not cointegrated with any other stock"), print(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 <- c(CopairsR, CopairsC)
        CopairsE <- unique(CopairsE)
        CopairsE <- ifelse(length(CopairsE)==0, print("The Stock is not cointegrated with any other stock"), print(CopairsE))
    }   else {
        print("The stock either do not have enough Observation or is not I(1)")
    }
})

output$`Possible Pairs` <- renderPrint({
    Coin <- Coin()
})

下面是第 2 页下拉菜单的代码 - 这不起作用。它只给了我一个值,这是你在股票“A”的情况下看到的第一个值。

#Input - Pair Selection

    observe({
    updateSelectInput(session, "Pair_Sym" , choices = Coin())
})

Page 1 Page 2

编辑 - 数据和整个代码可以在这里找到。 https://github.com/AvisR/Shiny

这是因为 CopairsE <- unique(CopairsE) returns 是一个带引号的字符向量。您可以通过 debugging your Shiny app.

验证对象的类型

尝试使用 noquote() 函数和 return 结果到 Coin() 反应:

        CopairsE <- unique(CopairsE)
        vars <- noquote(CopairsE)
        CopairsE <- ifelse(length(CopairsE)==0, print("The Stock is not cointegrated with any other stock"), print(CopairsE))
        return(vars)