繁体   English   中英

R shiny 问题用按钮调用我的 function

[英]R shiny problem calling my function with a button

我在服务器中将 function 定义为“RunPlot <- function(tickers, shareVec, FromDate, ToDate)”。 function 应返回单个数值。 我想通过单击“Go”按钮来获取 output 这个值,但是当我单击该按钮时,什么也没有发生。 此外,我尝试在单独的脚本中调用此 function 并且一切正常,因此 function 内部没有错误。 这是我的代码:

用户界面


shinyUI(fluidPage(

    titlePanel("test"),

    sidebarLayout(
        sidebarPanel(
            actionButton("Go", "Go!")
        ),

        mainPanel(
            textOutput("TEST")
        )
    )
))

服务器

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)
        
        return(BETA)   
        
    }


observeEvent(input$Go, {
    BETA <- RunPlot("MSFT",5,as.Date("2019-12-31"),as.Date("2020-12-31"))
})
output$TEST <- renderText({
    paste(BETA)
})
    
})

任何形式的帮助将不胜感激!

您的 object BETA仅在观察者内部可用。 使其在外部可用的一种方法是创建一个reactiveValues object,如下所示。

  rv <- reactiveValues()
  observeEvent(input$Go, {
    rv$BETA <- RunPlot("MSFT",5,as.Date("2019-12-31"),as.Date("2020-12-31"))
  })
  output$TEST <- renderText({
    paste(rv$BETA)
  })

输出

编辑:

ui端使用来自dateRangeInput的用户输入日期

textInput("symb", "Symbol", value="MSFT"),
dateRangeInput("dates","Date range",start = "2019-01-01",end = as.character(Sys.Date())),

服务器端调用将是

rv$BETA <- RunPlot(req(input$symb),5,input$dates[1],input$dates[2])

输出

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM