【问题标题】:Returning Multiple Objects in Shiny在 Shiny 中返回多个对象
【发布时间】:2020-04-26 00:22:08
【问题描述】:

R 用户您好,我对 Shiny 比较陌生,我正在尝试开发一个基本的应用程序,它需要 4 只股票并打印最佳投资组合权重并绘制图表这些权重。但是,我的应用程序仅打印最佳投资组合权重,而不是图表权重图。 这是我的代码:

library(shiny)
library(PortfolioAnalytics)
library(quantmod)
library(PerformanceAnaltics)

server = function(input, output, session) {
  dsf=reactive({
    ticker<-c(input$stock1, input$stock2, input$stock3, input$stock4)
    portfolioPrice <- NULL
    for(ticker in ticker) {
      portfolioPrice <- cbind(portfolioPrice,
                              getSymbols.yahoo(ticker,  periodicity = 'daily', auto.assign=FALSE)[,6])
    }
    poty=na.omit(ROC(portfolioPrice))

    portf <- portfolio.spec(colnames(poty))
    portf <- add.constraint(portf, type="weight_sum", min_sum=.99, max_sum=1.01)
    portf <- add.constraint(portf, type="box", min=.02, max=.60) 
    portf<-add.constraint(portf,type="transation_cost", ptc=.001)
    portf <- add.objective(portfolio = portf, type="return", name="mean")
    portf <- add.objective(portfolio = portf, type="risk", name="StdDev")


    optPort <- optimize.portfolio(poty, portf, optimize_method = "random", trace=TRUE)
    ws=extractWeights(optPort)


    silf=chart.Weights(optPort)

    return(list(silf, ws))



  })



  output$wad<-renderPrint({
    dsf()
  })

  output$wadS<-renderPlot({
    dsf()
  })





} # the server

ui = basicPage(
  textInput("stock1", "stock1"),
  textInput("stock2", "stock2"),
  textInput("stock3", "stock3"),
  textInput("stock4", "stock4"),


  verbatimTextOutput("wad"),
  plotOutput("wadS")



) # the user interface

shinyApp(ui = ui, server = server) # perform app launch


这是应用程序的图片

如您所见,该应用获取 4 只股票并返回最佳投资组合权重,但它不仅应该打印最佳权重,还应该绘制权重图表。

像这样:

如何让我的应用返回打印的重量并返回我的图表重量,非常感谢您的帮助

【问题讨论】:

  • 大家好,我真的需要帮助,这对我来说真的很重要。有人需要我澄清这个问题吗?
  • 试试类似:output$wadS&lt;-renderPlot({dsf()$silf})。如果您使您的代码可重现并表明您阅读了更多教程,您可能会得到更多响应。万事如意!

标签: r shiny shiny-server quantitative-finance shiny-reactivity


【解决方案1】:

问题是您在 dsf 反应对象内的列表中返回两个不同的对象,但您指定从该列表中渲染文本和绘图,这没有任何意义。

最好的方法是将你的反应对象分解成单独的反应对象。试试下面的。在这里,我已将其设置为 dsf() 容纳数据和两个独立的反应对象,ws 用于打印,silf 用于绘图:

library(shiny)
library(PortfolioAnalytics)
library(quantmod)
library(PerformanceAnaltics)

server <- function(input, output, session) {
  dsf <- reactive({
    ticker<-c(input$stock1, input$stock2, input$stock3, input$stock4)
    portfolioPrice <- NULL
    for(ticker in ticker) {
      portfolioPrice <- cbind(portfolioPrice,
                              getSymbols.yahoo(ticker,  periodicity = 'daily', auto.assign=FALSE)[,6])
    }
    poty=na.omit(ROC(portfolioPrice))

    portf <- portfolio.spec(colnames(poty))
    portf <- add.constraint(portf, type="weight_sum", min_sum=.99, max_sum=1.01)
    portf <- add.constraint(portf, type="box", min=.02, max=.60) 
    portf<-add.constraint(portf,type="transation_cost", ptc=.001)
    portf <- add.objective(portfolio = portf, type="return", name="mean")
    portf <- add.objective(portfolio = portf, type="risk", name="StdDev")


    optimize.portfolio(poty, portf, optimize_method = "random", trace=TRUE)
  })

  ws <- reactive({
    extractWeights(dsf())
  })


  silf <- reactive({
    chart.Weights(dsf())
  })

  output$wad<-renderPrint({
    ws()
  })

  output$wadS<-renderPlot({
    silf()
  })

  } # the server

ui = basicPage(
  textInput("stock1", "stock1"),
  textInput("stock2", "stock2"),
  textInput("stock3", "stock3"),
  textInput("stock4", "stock4"),


  verbatimTextOutput("wad"),
  plotOutput("wadS")

) # the user interface

shinyApp(ui = ui, server = server) # perform app launch

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 2013-06-03
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多