每当我第一次启动此应用程序时,“备用现金”的输出值都会根据上一个掷骰来更新(如果最后一个掷骰获胜,则该值会增加,如果最后一个掷骰则是亏损的) ,它会减小值),并且如果我重新启动应用,则两次运行总共输入12次后,它将再次执行该操作。之后重新启动,由于某种原因,一切都很好。此外,由于s落后,所以Game Over输出也落后。为什么会这样?
我尝试完全删除e和func1,以查看问题是否出在界面的其他部分,但这并不能解决我的问题。我希望我能理解为什么它会以一种特定且可预测的方式引起问题,因为我不知道必须重新运行并必须输入12次值有什么特别之处。我希望可以提供更多的背景知识,但我不会陷入困境。
编辑:我现在已经将betting1定义为服务器中的反应函数(并将betting1(input $ amount)相应地更改为betting1()),并且仍然存在相同的问题。
library(shiny)
e <- 0
betting1 <- function(p){
if(is.numeric(p)==T){
x <<- sample(1:6, size = 1)
y <<- sample(1:6, size = 1)
z <<- sum(x,y)
print(z)
if (z == 6| z == 7| z == 8| z == 12) {
e <<- 1
t <- p }
else {
e <<- 0
t <- -p }
return(t)
}
}
func1 <- function(b){
if (e==1){print(paste0("Won: $", b))}
else if(e==0) {print(paste0("Lost: $", b))}}
# Define UI ----
ui <- fluidPage(titlePanel("Game pays you back the amount that you bet. Win on a dice sum of: 6, 7, 8, or 12. Start with $100."),
fluidRow(
sidebarPanel("Game Info: ",br(),"Game #1",
textOutput("numeric_amount"),
textOutput("roll"),
textOutput("outcome")
),
column(4,numericInput("amount", h3("$ Betting Amount"), value = NA)),
column(8,submitButton("Confirm Bet"))
),
mainPanel(
textOutput("game_info"),
textOutput("avg"), br(),
textOutput("plays"), br(),
textOutput("Game_Over"), br(), br(),
textOutput("saves")
)
)
# Define server logic ----
server <- function(input, output){
v <- NULL
s <- 100
i <- 0
output$game_info <- renderText({
l<-betting1(input$amount)
if(input$amount>0 & is.numeric(input$amount)==T){ s<<-(s+l) }
paste("Spare Cash: $", s)})
output$numeric_amount <- renderText({paste("Your last bet: $", input$amount)})
output$avg <- renderText({
if(input$amount>0 & is.numeric(input$amount)==T){
v<<-c(v, input$amount)
paste("Average bet: $", mean(v))}
})
output$outcome <- renderText({paste(func1(input$amount)) })
output$plays <- renderText({
if(input$amount>0 & is.numeric(input$amount)==T){
i<<-i+1
paste("Plays: ", i)}
else{ paste("Plays: ", i)}
})
output$roll <- renderText({
if(input$amount>0 & is.numeric(input$amount)==T){
paste("First Die: ", x, " Second Die: ", y, " Sum: ", z)}
})
output$Game_Over <- renderText({
if(input$amount>0 & is.numeric(input$amount)==T){
if (s<=0){paste("Game Over. Tally your results (Spare Cash, Avg. Bet, Plays) and send them to - with your game number.")}
else {paste("You can choose to stop at any point. When you do, tally your results (Spare Cash, Avg. Bet, Plays) and send them to - with your game number.") }
}
else { paste("Please input a number larger than 0.")}
})
}
# Run the app ----
shinyApp(ui = ui, server = server)
答案 0 :(得分:0)
如果在服务器部分内部而不是外部标准函数中定义函数betting1()
为反应性函数,这似乎可以按预期工作(即使是游戏结束也没有滞后)。
server <- function(input, output){
v <- NULL
s <- 100
i <- 0
betting1 <- reactive({
p <- input$amount
if(is.numeric(p)==T){
x <<- sample(1:6, size = 1)
y <<- sample(1:6, size = 1)
z <<- sum(x,y)
print(z)
if (z == 6| z == 7| z == 8| z == 12) {
e <<- 1
t <- p }
else {
e <<- 0
t <- -p }
return(t)
}
})
[...]
当一个函数被多次调用,并且环境中的某些元素正在改变但不是全部都在变化时,响应函数在闪亮的应用程序中确实很有用。反应式只会更新必要的内容。 您可以获取更多信息here。