1

这是一个玩具示例,其中我每秒绘制一个介于 1 和 10 之间的数字,并且我只想在刚刚绘制的实际数字与之前绘制的数字之间的差等于 1 时才显示这些数字。所以如果抽出的数字顺序为:[5,7,8,2,3]。我想连续显示[8,3]。我想这都是关于反应值和隔离功能的,但我无法意识到我想要什么。我在评论中的失败尝试。

library(shiny)


ui <- shinyUI(fluidPage(
  mainPanel(
    textOutput("time"),
    textOutput("num")
  )
))

server <- function(input, output, session) {

  autoInvalidate <- reactiveTimer(1000)
  timestamp<-reactive({
    autoInvalidate()
    Sys.time()
  })

  random_num<-reactive({
    autoInvalidate()
    sample(x=seq(1,10),size = 1,replace = FALSE,pro)
  })

# My attempt : obviously do not work
#   values <- reactiveValues(old=1)
#   observe({
#     if (random_num()==values$old) {values$display=random_num()}
#     else {values$old=random_num()}
#   })  

  output$time <- renderText({paste("time :",timestamp())})
  output$num <- renderText({paste("num :",random_num())})
  #My attempt : obviously do not work
  # output$num <- renderText({paste("num :",isolate(values$display))})
}

shinyApp(ui, server)

我知道有一个看起来像我的问题,但它完全不同。

4

1 回答 1

3

这是一个例子。

library(shiny)

old <- NULL

ui <- shinyUI(fluidPage(
  mainPanel(
    textOutput("time"),
    textOutput("num"),
    textOutput("num_raw")
  )
))

server <- function(input, output, session) {

  autoInvalidate <- reactiveTimer(1000)

  timestamp<-reactive({
    autoInvalidate()
    Sys.time()
  })

  random_num<-reactive({
    autoInvalidate()
    r <- sample(x=seq(1,10),size = 1,replace = FALSE)
  })

  observe({
    output$time <- renderText({paste("time :",timestamp())})
    r <- random_num()
    if (!is.null(old) && r - old == 1) {
      output$num <- renderText({paste("num :",r)})
    }
    output$num_raw <- renderText({paste("raw num : ", r)})
    old <<- r
  })

}

shinyApp(ui, server)
于 2016-10-02T04:09:15.557 回答