R 与 renderPlot 的闪亮麻烦

时间:2021-03-19 22:07:57

标签: r shiny

我正在使用一个函数来打印绘图。这个函数只会被调用一次,以便将绘图打印到 UI(当我点击“Go”按钮时)。问题是绘图只打印到控制台而不是用户界面。没有错误信息。我认为我的 renderPlot 可能有问题。这是我的代码:

界面

library(shiny)

shinyUI(fluidPage(
    
    titlePanel("test"),
    
    sidebarLayout(
        sidebarPanel(
            actionButton("Go", "Go!")
        ),
        
        mainPanel(
            plotOutput("FUN3")
        )
    )
))

服务器

library(shiny)
library(quantmod)                            
library(PerformanceAnalytics)

shinyServer(function(input, output) {
    
    RunPlot <- function(tickers, sharesVec, FromDate, ToDate){
        
        PortfolioPrices <- NULL 
        for (i in tickers){
            PortfolioPrices <- cbind(PortfolioPrices, 
                                     getSymbols.yahoo(i, from = FromDate, to = ToDate,             
                                                      auto.assign = F)[,6])  
        }  
        
        TempValue <- PortfolioPrices[1,]
        MarketValue <- sharesVec*TempValue
        Weights <- MarketValue/sum(MarketValue) #Now have Weights AND Tickers vectors
        
        #C) Compute Portfolio Returns
        for (j in 1:ncol(PortfolioPrices)){          #Data cleaning                                                      
            for (i in 1:nrow(PortfolioPrices)){
                if (is.na(PortfolioPrices[i,j]) == TRUE){
                    PortfolioPrices[i,j] <- PortfolioPrices[i-1,j]
                }
            }
        }
        
        Rf <- getQuote("^TNX", src = "yahoo")[1,2]/100
        AssetsReturns <- na.omit(ROC(PortfolioPrices, type = "discrete"))                                  
        PortfolioReturns <- Return.portfolio(AssetsReturns, weights = Weights)                             
        PortfolioAnnualizedReturns <- table.AnnualizedReturns(PortfolioReturns, Rf = Rf/252)                            
        colnames(PortfolioAnnualizedReturns) <- "Portfolio"
        
        #D) Compute Benchmark Returns
        SP500 <- getSymbols.yahoo("SPY", from = FromDate, to = ToDate, auto.assign = F)[,6]       
        SP500Returns <- na.omit(ROC(SP500, type = "discrete"))                                             
        SP500AnnualizedReturns <- table.AnnualizedReturns(SP500Returns, Rf = Rf/252)  
        colnames(SP500AnnualizedReturns) <- "S&P500"
        
        SPTSX <- getSymbols.yahoo("XIC.TO", from = FromDate, to = ToDate, auto.assign = F)[,6]   
        SPTSXReturns <- na.omit(ROC(SPTSX, type = "discrete"))                                             
        SPTSXAnnualizedReturns <- table.AnnualizedReturns(SPTSXReturns, Rf = Rf/252) 
        colnames(SPTSXAnnualizedReturns) <- "S&P/TSX"
        
        MSCIIMI <- getSymbols.yahoo("XEF.TO", from = FromDate, to = ToDate, auto.assign = F)[,6]   
        MSCIIMIReturns <- na.omit(ROC(MSCIIMI, type = "discrete"))                                             
        MSCIIMIAnnualizedReturns <- table.AnnualizedReturns(MSCIIMIReturns, Rf = Rf/252) 
        colnames(MSCIIMIAnnualizedReturns) <- "MSCI EAFE IMI"
        
        MSCIEME <- getSymbols.yahoo("XEC.TO", from = FromDate, to = ToDate, auto.assign = F)[,6]   
        MSCIEMEReturns <- na.omit(ROC(MSCIEME, type = "discrete"))                                             
        MSCIEMEAnnualizedReturns <- table.AnnualizedReturns(MSCIEMEReturns, Rf = Rf/252) 
        colnames(MSCIEMEAnnualizedReturns) <- "MSCI Emerging Markets"
        
        #E) Format Data
        PortfolioCumReturns <- fortify.zoo(PortfolioReturns+1)                                             
        SP500CumReturns <- fortify.zoo(SP500Returns+1)
        SPTSXCumReturns <- fortify.zoo(SPTSXReturns+1)
        MSCIIMICumReturns <- fortify.zoo(MSCIIMIReturns+1)
        MSCIEMECumReturns <- fortify.zoo(MSCIEMEReturns+1)
        
        for (j in 2:nrow(PortfolioCumReturns)){                                                            
            PortfolioCumReturns[j,2] <- PortfolioCumReturns[j-1,2]*PortfolioCumReturns[j,2]
        }
        for (j in 2:nrow(SP500CumReturns)){
            SP500CumReturns[j,2] <- SP500CumReturns[j-1,2]*SP500CumReturns[j,2]
        }
        for (j in 2:nrow(SPTSXCumReturns)){
            SPTSXCumReturns[j,2] <- SPTSXCumReturns[j-1,2]*SPTSXCumReturns[j,2]
        }
        for (j in 2:nrow(MSCIIMICumReturns)){
            MSCIIMICumReturns[j,2] <- MSCIIMICumReturns[j-1,2]*MSCIIMICumReturns[j,2]
        }
        for (j in 2:nrow(MSCIEMECumReturns)){
            MSCIEMECumReturns[j,2] <- MSCIEMECumReturns[j-1,2]*MSCIEMECumReturns[j,2]
        }
        
        PortfolioCumReturns <- PortfolioCumReturns - 1                                                      
        SP500CumReturns <- SP500CumReturns - 1
        SPTSXCumReturns <- SPTSXCumReturns - 1
        MSCIIMICumReturns <- MSCIIMICumReturns - 1
        MSCIEMECumReturns <- MSCIEMECumReturns - 1
        
        ### Results ###
        
        ReturnsTABLE <- cbind(PortfolioAnnualizedReturns,SP500AnnualizedReturns,SPTSXAnnualizedReturns,MSCIIMIAnnualizedReturns,MSCIEMEAnnualizedReturns)
        
        Benchmark <- getSymbols.yahoo("^GSPC", from = FromDate, to = ToDate, auto.assign = F)[,6]   
        BenchmarkReturns <- na.omit(ROC(Benchmark, type = "discrete"))  
        BETA <- CAPM.beta(PortfolioReturns, BenchmarkReturns, Rf/252)
        ALPHA <- CAPM.jensenAlpha(PortfolioReturns, BenchmarkReturns, Rf/252)
        
        plot(PortfolioCumReturns, type = "l", xlab = "Time", ylab = "Returns", main = "Performance Overview", 
             ylim = range(min(PortfolioCumReturns[,2],SP500CumReturns[,2],SPTSXCumReturns[,2],MSCIIMICumReturns[,2],MSCIEMECumReturns[,2]), 
                          max(PortfolioCumReturns[,2],SP500CumReturns[,2],SPTSXCumReturns[,2],MSCIIMICumReturns[,2],MSCIEMECumReturns[,2])), xaxs="i")
        lines(SP500CumReturns, col = "firebrick")
        lines(SPTSXCumReturns, col = "steelblue")
        lines(MSCIIMICumReturns, col = "grey68")
        lines(MSCIEMECumReturns, col = "slateblue")
        grid(col = "black", nx = 12, ny = NULL)
        legend("topleft", legend = c("Portfolio","S&P500","S&P/TSX","MSCI EAFE IMI","MSCI Emerging Markets"), col = c("black", "firebrick","steelblue","grey68","slateblue"), cex = 0.8, lty = 1.2)  
        
    }
    
    output$FUN3 <- renderPlot({
        observeEvent(input$Go, {
            RunPlot("MSFT",5,
                    "2019-12-31",
                    "2020-12-31")
        })
    })
})

任何帮助将不胜感激!谢谢

1 个答案:

答案 0 :(得分:0)

您应该将 observeEvent 放在 renderPlot 之外。为了使其不对股票代码的变化做出反应,您需要isolate()反应性变量。

  observeEvent(input$Go, {
    output$FUN3 <- renderPlot({
      RunPlot(isolate(input$ticker),5, "2019-12-31", "2020-12-31")
    })
  })

output

相关问题