Возврат нескольких объектов в Shiny - PullRequest
0 голосов
/ 26 апреля 2020

Здравствуйте, пользователи R! Я относительно новичок в блестящем, я пытаюсь разработать базовое приложение c, которое берет 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


Вот изображение приложения

enter image description here

Как вы можете видеть, приложение берет 4 акций и возвращает оптимальные веса портфеля, однако предполагается, что он не только распечатывает оптимальные веса, но также должен составлять график весов.

вот так:

enter image description here

Как мне заставить мое приложение возвращать напечатанные веса и возвращать мой график нанесенных на карту весов, большое спасибо за вашу помощь

1 Ответ

1 голос
/ 26 апреля 2020

Проблема заключается в том, что вы возвращаете два разных объекта в списке в пределах 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
...