shiny的核心是通知机制

上课学了最最基本的 shiny 的知识. 说点感受.

reactiveValues, 我们为什么一定得用它? 难道就不能用普通的 R 对象么? 当然可以. 如果一个表达式不依赖任何 input 和 output, 它就可以不在交互函数中. 首先先说 reactive 是怎样的存在, 它其实就是依赖 input 的 R 表达式. reactiveValues 也是同理, 但它更灵活. 它可以在别处用, 主要是在 observeEvent 这类监听函数中, 否则它交互的作用就发挥不了了.

比如

library(shiny)
ui <- fluidPage(
  actionButton("unif","Uniform"),
  actionButton("norm", "Normal"),
  plotOutput("hist")
)

server <- function(input, output) {
  rv=list(data=runif(100)) # 本来是rv=reactiveValues(data=rnorm(100))
  rv$title = "Normal Distribution"
  observeEvent(input$unif, {rv$data = runif(100) 
  rv$title = "Uniform Distribution"})
  observeEvent(input$norm, {rv$data = rnorm(100)
  rv$title = "Normal Distribution"})
  output$hist = renderPlot(hist(rv$data, main=paste("Histogram of",rv$title)))
}

shinyApp(ui = ui, server = server)

它的结果是, 无论点击什么按钮, 都不会改变. 为什么会这样? observeEvent 的确让 rv 发生了变化. 但 renderPlot 却并不知道.

据此, 我认为 shiny 的 server 核心是如何传递数据的

posted @ 2020-12-02 15:09  Tokubara  阅读(106)  评论(0编辑  收藏  举报