在 Shiny 中返回多个对象
Returning Multiple Objects in Shiny
各位 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 只股票和 returns 最佳投资组合权重,但它不仅应该打印最佳权重,而且还应该绘制权重图表。
像这样:
如何让我的应用程序获得 return 打印的重量和 return 我的图表重量图,非常感谢您的帮助
问题是您在 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
各位 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 只股票和 returns 最佳投资组合权重,但它不仅应该打印最佳权重,而且还应该绘制权重图表。
像这样:
如何让我的应用程序获得 return 打印的重量和 return 我的图表重量图,非常感谢您的帮助
问题是您在 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