アプリで非常に奇妙な問題が発生しています。UI は 5 つのタブで構成されています。最初の 2 つには、ユーザーが編集でき、計算の入力として使用される RHandsontables が含まれています。最後の 3 つには、[実行] ボタンをクリックした後に生成される DataTable 出力が含まれています。
アプリを開いて、どのタブもクリックせずに (つまり、既定のタブのままにして) [実行] をクリックすると、次のメッセージが表示されてアプリがクラッシュします。
Listening on http://127.0.0.1:5554
Warning: Error in do.call: second argument must be a list
Stack trace (innermost first):
67: do.call
66: hot_to_r
65: observeEventHandler [path/to/serverfile]
ただし、アプリを開いて他のタブのいずれかをクリックし、最初のタブに戻って [実行] をクリックすると、アプリは問題なく実行されます。別のタブをクリックしてから元のタブに戻っても、入力などに関して実際には何も変更されていないため、これは意味がありません。
do.call("rbind", list)
サーバー ファイルにはいくつかの機能があり、問題の原因となっている機能を特定するのは非常に困難です。それらのいずれにおいても、リスト以外のものが 2 番目の引数として渡されていることは明らかではありません。
私のサーバーとuiファイルは以下です。計算の大部分を省略しました。ここで問題を完全に再現できないことをお詫びします。誰かが気付くかもしれないアプリの構造に明らかなエラーがあることを願っています. どんな提案も歓迎
サーバー.R
library(tidyverse)
library(shiny)
library(DT)
library(rhandsontable)
# Server file for World Cup Outright App
shinyServer(function(input,output,session){
values <- reactiveValues()
output$Results <- renderRHandsontable({
if (input$currentStage=="Group Stage"){
rhandsontable(read.csv("path/to/file", colClasses = c('character','character','numeric','numeric')))
}
else if (input$currentStage=="Last 16"){
rhandsontable(read.csv("path/to/file", colClasses = c('character','character','numeric','numeric')))
}
else{
rhandsontable(read.csv("path/to/file", colClasses = c('character','character','numeric','numeric')))
}
})
observeEvent(input$runButton,{
values$results_table <- hot_to_r(input$Results)
})
output$Ratings <- renderRHandsontable({
rhandsontable(read.csv("path/to/file", colClasses=c('character','numeric','numeric','numeric','numeric')))
})
observeEvent(input$runButton,{
values$ratings_table <- hot_to_r(input$Ratings)
})
price_markets <- eventReactive(input$runButton, {
withProgress(message="Loading...",{
t1 <- Sys.time()
# Choose the number of simulations required
sims <- as.numeric(input$simsInput)
if(is.null(sims)){return()}
Games <- read.csv("path/to/file",header = TRUE,colClasses = c('character','character','numeric','numeric'))
ratingvratingfile <- read.csv("path/to/file", colClasses=c('numeric','numeric'),header=F,col.names=c('diff','prob1','prob2'))
Last16Games <- read.csv("path/to/file",header = TRUE,colClasses = c('character','character','character','numeric','numeric'))
QuarterFinalGames <- read.csv("path/to/file",header = TRUE,colClasses = c('character','character','character','numeric','numeric'))
groupLookup <- read.csv("path/to/file", colClasses = c('character','character'))
continentLookup <- read.csv("path/to/file", colClasses = c('character','character'))
liveresults <- values$results_table
liveLast16results <- values$results_table
liveQFresults <- values$results_table
ratingsfile <- values$ratings_table
CurrentStage <- input$currentStage
if(CurrentStage=="Group Stage"){
# CALCULATIONS
}
if (CurrentStage=="Last 16"){
# CALCULATIONS
}
if(CurrentStage=="Quarter Finals"){
# CALCULATIONS
}
t2 <- as.numeric(difftime(Sys.time(), t1),units="mins")
t2 <- round(t2,2)
t2 <- paste0(as.character(t2)," minutes to run sims")
# Put outputs in a list to be accessed by renderDataTable functions later
list(groupApositions,groupAforecasts,groupAtricasts,
groupBpositions,groupBforecasts,groupBtricasts,
groupCpositions,groupCforecasts,groupCtricasts,
groupDpositions,groupDforecasts,groupDtricasts,
groupEpositions,groupEforecasts,groupEtricasts,
groupFpositions,groupFforecasts,groupFtricasts,
groupGpositions,groupGforecasts,groupGtricasts,
groupHpositions,groupHforecasts,groupHtricasts,
to_reach,stage_of_elim,name_the_finalists,t2,
winners1,winners2)
})
})
output$groupStagePositionTable <- DT::renderDataTable(DT::datatable({
if(input$groupMarkets=="Group A"){
table <- price_markets()[[1]]
}
if(input$groupMarkets=="Group B"){
table <- price_markets()[[4]]
}
if(input$groupMarkets=="Group C"){
table <- price_markets()[[7]]
}
if(input$groupMarkets=="Group D"){
table <- price_markets()[[10]]
}
if(input$groupMarkets=="Group E"){
table <- price_markets()[[13]]
}
if(input$groupMarkets=="Group F"){
table <- price_markets()[[16]]
}
if(input$groupMarkets=="Group G"){
table <- price_markets()[[19]]
}
if(input$groupMarkets=="Group H"){
table <- price_markets()[[22]]
}
return(table)}),rownames=FALSE,options=list(pageLength=100,info=FALSE,paging=FALSE,searching=FALSE))
output$groupStageForecastTable <- DT::renderDataTable(DT::datatable({
if(input$groupMarkets=="Group A"){
table <- price_markets()[[2]]
}
if(input$groupMarkets=="Group B"){
table <- price_markets()[[5]]
}
if(input$groupMarkets=="Group C"){
table <- price_markets()[[8]]
}
if(input$groupMarkets=="Group D"){
table <- price_markets()[[11]]
}
if(input$groupMarkets=="Group E"){
table <- price_markets()[[14]]
}
if(input$groupMarkets=="Group F"){
table <- price_markets()[[17]]
}
if(input$groupMarkets=="Group G"){
table <- price_markets()[[20]]
}
if(input$groupMarkets=="Group H"){
table <- price_markets()[[23]]
}
return(table)}),rownames=FALSE,options=list(pageLength=100,info=FALSE,paging=FALSE,searching=FALSE))
output$groupStageTricastTable <- DT::renderDataTable(DT::datatable({
if(input$groupMarkets=="Group A"){
table <- price_markets()[[3]]
}
if(input$groupMarkets=="Group B"){
table <- price_markets()[[6]]
}
if(input$groupMarkets=="Group C"){
table <- price_markets()[[9]]
}
if(input$groupMarkets=="Group D"){
table <- price_markets()[[12]]
}
if(input$groupMarkets=="Group E"){
table <- price_markets()[[15]]
}
if(input$groupMarkets=="Group F"){
table <- price_markets()[[18]]
}
if(input$groupMarkets=="Group G"){
table <- price_markets()[[21]]
}
if(input$groupMarkets=="Group H"){
table <- price_markets()[[24]]
}
return(table)}),rownames=FALSE,options=list(pageLength=50,info=FALSE,paging=FALSE,searching=FALSE))
output$outrightMarketTable <- DT::renderDataTable(datatable({
if(input$outrightMarkets=="To Reach"){
table1 <- price_markets()[[25]]
}
if(input$outrightMarkets=="Stage of Elimination"){
table1 <- price_markets()[[26]]
}
if(input$outrightMarkets=="Name the Finalists"){
table1 <- price_markets()[[27]]
}
return(table1)}),rownames=FALSE,options=list(paging=FALSE))
output$winningGroupTable <- DT::renderDataTable(datatable({
table <- price_markets()[[29]]
return(table)
}),rownames=FALSE,options=list(searching=FALSE,info=FALSE,paging=FALSE))
output$winningContinent <- DT::renderDataTable(datatable({
table <- price_markets()[[30]]
return(table)
}),rownames=FALSE,options=list(searching=FALSE,info=FALSE,paging=FALSE))
output$timeElapsed <- renderText({price_markets()[[28]]})
})
ui.R
library(tidyverse)
library(shiny)
library(DT)
library(rhandsontable)
# User Interface for World Cup Outright App
shinyUI(fluidPage(
titlePanel("World Cup Outright Simulator"),
sidebarLayout(
sidebarPanel(
selectInput('currentStage','Choose current stage',c("Group Stage","Last 16","Quarter Finals")),
textInput("simsInput",label="Number of Simulations",value = 10000),
actionButton("runButton","Run"),
h2(textOutput("timeElapsed"))
),
mainPanel(
tabsetPanel(
tabPanel("Results",
rHandsontableOutput("Results")),
tabPanel("Ratings",
rHandsontableOutput("Ratings")),
tabPanel("Group Stage",
selectInput('groupMarkets','Choose Group',c("Group A", "Group B","Group C","Group D","Group E","Group F","Group G","Group H")),
h3("Group Positions"),
DT::dataTableOutput("groupStagePositionTable"),
h3("Group Forecasts"),
DT::dataTableOutput("groupStageForecastTable"),
h3("Group Tricasts"),
DT::dataTableOutput("groupStageTricastTable")
),
tabPanel("Outright",
selectInput('outrightMarkets','Choose Market',c("To Reach","Stage of Elimination","Name the Finalists")),
DT::dataTableOutput("outrightMarketTable")),
tabPanel("Special",
h3("Winning Group"),
DT::dataTableOutput("winningGroupTable"),
h3("Winning Continent"),
DT::dataTableOutput("winningContinent"))
)
)
)
)
)