Код повторного использования того же входного значения каждый 12-й ввод и начальный ввод - PullRequest
1 голос
/ 04 апреля 2019

Каждый раз, когда я запускаю это приложение в первый раз, выходное значение для запасных денежных средств обновляется на основе предыдущего броска кубика (если последний бросок был выигрышем, он увеличивает значение, если последнее значение было проигрышем, это уменьшает значение), и если я перезапущу приложение, оно будет делать это снова после 12 полных входов в обоих запусках.Перезапуск после этого и все нормально по какой-то причине.Кроме того, поскольку s отстает, выход Game Over также отстает.Почему это так?

Я попытался полностью удалить e и func1, чтобы проверить, была ли моя проблема с другими частями интерфейса, но это не решило мою проблему.Хотелось бы, чтобы я понял, почему это вызывает проблему таким специфическим и предсказуемым образом, потому что я не знаю, что особенного в том, что приходится повторно запускать и вводить значения 12 раз.Хотелось бы предоставить больше информации, но я зашла в тупик.

РЕДАКТИРОВАТЬ: я определил betting1 как реактивную функцию сейчас на сервере (и изменил betting1 (input $ сумму) на 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 голосов
/ 04 апреля 2019

Похоже, что он работает должным образом (без задержки, даже для Game Over), если вы определяете свою функцию 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)
    }
  })

[...]

Реактивные функции действительно полезны в блестящем приложении, когда функция вызывается несколько раз и что некоторые элементы вашей среды меняются, но не все.Реактив будет обновлять только то, что необходимо.Вы можете получить больше информации здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...