[英]R Shiny - What is the problem with my observe function ({UpdateSelectInput})?
[英]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.