【问题标题】:New dropdown inputs based on previous reactive Output - R Shiny基于先前反应输出的新下拉输入 - R Shiny
【发布时间】:2021-11-04 07:34:09
【问题描述】:

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

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

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

仪表板的流程如下-

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

我在第 1 页没有问题。

第 2 页 -> 选择与股票 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

【问题讨论】:

  • 嗨,欢迎来到 SO !你应该提供一个minimal reproducible example,这样我们就可以测试你的代码有什么问题。我尝试了托管在您的 GitHub 链接上的代码,但出现了一些错误,无法启动应用程序。
  • 我的错。我认为代码会起作用。你能告诉我错误是什么吗?同时,让我想办法创建 MRE。
  • 在全球环境中创建 Breakpoints 时出现“未定义的选定列”错误 - 结构中断部分。
  • 我无法修复您遇到的错误,因为我无法复制它。但我已经创建了所有必需的数据集和代码以使其工作。 MRE 可以找到here

标签: r shiny reactive-programming quantitative-finance


【解决方案1】:

这是因为CopairsE &lt;- unique(CopairsE) 返回一个带引号的字符向量。您可以通过debugging your Shiny app 验证您的对象类型。

尝试使用noquote()函数并将结果返回给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)

【讨论】:

  • 嗨 Julien,我仍然得到相同的结果。我删除了引号,我的第一页中的结果没有引号,但下拉列表仍然只有一个值。 .
  • 我能够使它与您的简化版本一起使用。尝试使用 APPL 股票代码。要使其与 A 符号一起使用,请使用与 CopairsU 相同的原理。
  • 我有一个奇怪的问题。当我运行 ifelse 函数时,它会删除除第一个元素之外的所有元素。 (例如,如果股票“A”,而不是结果是“BIIB”“CI”“DLTR”“DUK”“EIX”“IBM”“IFF”“J”“KO”“LEG”“MNST”“PNR " "PPG" "SRE" "SWK" "ZBH",变成了"BIIB"
  • 如果我删除 ifelse 函数,它就可以工作。太感谢了。 ifelse 函数似乎将 CopairsE 或 CopairsU 更改为列表的第一个元素是否有原因? (在第 1 页打印整个列表时)
  • 你真的像我的例子那样返回vars吗?注意:如果您返回CopairsE,由于print(CopairsE) 语句,它将按照您所说的那样运行。
猜你喜欢
  • 2020-03-20
  • 2014-06-16
  • 1970-01-01
  • 2020-10-05
  • 2019-11-18
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 2021-02-10
相关资源
最近更新 更多