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 核心是如何传递数据的