为什么 Shiny 无法检测到 `observe` 之外的 `data.tree` 操作?

问题描述

Shiny 是否只能检测普通 R 的对象?如果是,它可以观察到哪些物体?
例如,我尝试了很多选项都没有成功检测到闪亮的 data.tree 变化。
有谁知道为什么会这样?

library(shiny)
library(data.tree)
data(acme)

ui <- fluidPage(
actionButton("go","go" ),tags$h2("text"),verbatimtextoutput("text"),tags$h2("text0"),verbatimtextoutput("text0"),tags$h2("text1"),verbatimtextoutput("text1"),tags$h2("text2"),verbatimtextoutput("text2"),tags$h2("text3"),verbatimtextoutput("text3"),tags$h2("text4"),verbatimtextoutput("text4")
)

server <- function(input,output,session) {
anum <- reactiveValues(a = 0)
a <- reactiveValues(acme = acme,f = NULL)
b <- reactiveVal(acme)
cc <- reactive(a$acme)
observeEvent(input$go,{
  z = sample(x = 1:100,size = 1)
  a$cach <<- a$acme$clone()
  anum$a <<- anum$a + 1
  a$acme$AddChild(paste0("New",z))
  a$f <<-  a$acme
  b(a$acme)
  print("a$acme")
  print(a$acme)
  print("b()")
  print(b())
})

### not working
output$text = renderPrint( print(a$f) )
output$text0 = renderPrint(print(b()))
output$text1 = renderPrint(print(cc()))

### working
observe({
  print(identical(a$acme,a$cach))
  output$text2 = renderPrint(print(b()))
})
### working
observe({
  anum$a
  output$text3 = renderPrint(print(a$acme))
})
### working
observeEvent(eventExpr =  anum$a,handlerExpr = {
  output$text4 = renderPrint(print(a$acme))
})
}

shinyApp(ui,server)

解决方法

原来添加:

        a$f <- 0 #to force reaction
        a$f <-  a$acme
        a$acme <- 0 #to force reaction
        a$acme <- a$f

“修复”了问题。

library(shiny)
library(data.tree)
data(acme)

ui <- fluidPage(
    actionButton("go","go" ),verbatimTextOutput("text"),verbatimTextOutput("text1"),verbatimTextOutput("text2"),verbatimTextOutput("text3"),verbatimTextOutput("text4")
    
)

server <- function(input,output,session) {
    
    anum <- reactiveValues(a = 0)
    a    <- reactiveValues(acme = acme,f = NULL)
    b    <- reactiveVal(acme)
    cc   <- reactive(a$acme)
    
    
    observeEvent(input$go,{
        z      <-  sample(x = 1:100,size = 1)
        a$cach <- a$acme$clone()
        anum$a <- anum$a + 1
        a$acme$AddChild(paste0("New",z))
        a$f    <- 0 #to force reaction
        a$f    <-  a$acme
        a$acme <- 0 #to force reaction
        a$acme <- a$f
        b(a$acme)
        print("a$acme")
        print(a$acme)
        print("b()")
        print(b())
        
        
    })
    
    ### not working
    output$text = renderPrint({
        req(a$f)
        print(a$f)})
    
    output$text2 = renderPrint(print(cc()))
    
    ## now it works
    observe({
        print(identical(a$acme,a$cach)) #this is triggering the update

        output$text1 = renderPrint(print(b()))


    })
    ### working
    observe({
        anum$a
        output$text3 = renderPrint(print(a$acme))
    })
    ### working
    observeEvent(eventExpr =  anum$a,handlerExpr = {
        output$text4 = renderPrint(print(a$acme))
        
    })
    
    
}

shinyApp(ui,server)

我认为 a$acme$AddChild(paste0("New",z)) 方法在调用时未检测到更改。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...