代码每第12个输入和初始输入重用相同的输入值

时间:2019-04-03 22:27:07

标签: r shiny

每当我第一次启动此应用程序时,“备用现金”的输出值都会根据上一个掷骰来更新(如果最后一个掷骰获胜,则该值会增加,如果最后一个掷骰则是亏损的) ,它会减小值),并且如果我重新启动应用,则两次运行总共输入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)

1 个答案:

答案 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