Class Shiny R 中的反应场
reactive field in Class Shiny R
是否可以在 class 或 class 中创建一个反应字段,当她的字段更改时通知应用程序?
我得到了这个 class 这是我的 shinyApp 的模型:
CatalogModele <- setRefClass("CatalogModele",
fields = list(catalogs = "list"),
methods = list(
initialize = function(catalogs_args = list()) {
catalogs <<- catalogs_args
},
add_catalog = function(key, value) {
catalogs[[key]] <<- value
}
)
)
当我在我的全局对象上使用 "add_catalog()" 时,我想更新一些闪亮的小部件。我试过了:
catalogModele <<- reactive({CatalogModele()})
on.exit(rm(catalogModele, pos = ".GlobalEnv"))
但是当我观察我的变量时什么也没有发生:
observeEvent(catalogModele(), {
str(catalogModele()$catalogs)
})
感谢阅读。
我将 R6
class 用于类似目的。也许看看这个会帮助你开发一个类似的设计以供参考classes
library(R6)
library(shiny)
myClass <- R6Class(
public = list(
catalogs = reactiveValues(),
add_catalog = function(key,value){
self$catalogs[[key]] <- value
}
)
)
A = myClass$new()
shinyApp(
fluidPage(
inputPanel(
textInput('key', 'key'),
textInput('value', 'value'),
actionButton('go', 'add')
),
verbatimTextOutput('textOut')
),
function(input, output, session){
observeEvent(input$go,
{ A$add_catalog(input$key, input$value) }
)
output$textOut <- renderPrint({
reactiveValuesToList(A$catalogs)
})
}
)
编辑:这是一个实际可行的解决方案。我只是将成员 reactives
从 R6
class 包装到一个列表中,并使其成为引用 class.
的成员
CatalogModele <- setRefClass(
"CatalogModele",
fields = list(catalogs = "list"),
methods = list(
initialize = function(catalogs_args = list()) {
catalogs <<- list(reactives = reactiveValues())
},
add_catalog = function(key, value) {
catalogs$reactives[[key]] <<- value
},
get_catalogs = function()
reactiveValuesToList(catalogs$reactives)
)
)
B = CatalogModele()
shinyApp(
fluidPage(
inputPanel(
textInput('key', 'key'),
textInput('value', 'value'),
actionButton('go', 'add')
),
verbatimTextOutput('textOut')
),
function(input, output, session){
observeEvent(input$go,
{ B$add_catalog(input$key, input$value) }
)
output$textOut <- renderPrint(B$get_catalogs())
}
)
在这两种情况下,建议只使 class 的某些部分具有反应性。否则,您的应用程序可能会遇到非常糟糕的性能。
是否可以在 class 或 class 中创建一个反应字段,当她的字段更改时通知应用程序?
我得到了这个 class 这是我的 shinyApp 的模型:
CatalogModele <- setRefClass("CatalogModele",
fields = list(catalogs = "list"),
methods = list(
initialize = function(catalogs_args = list()) {
catalogs <<- catalogs_args
},
add_catalog = function(key, value) {
catalogs[[key]] <<- value
}
)
)
当我在我的全局对象上使用 "add_catalog()" 时,我想更新一些闪亮的小部件。我试过了:
catalogModele <<- reactive({CatalogModele()})
on.exit(rm(catalogModele, pos = ".GlobalEnv"))
但是当我观察我的变量时什么也没有发生:
observeEvent(catalogModele(), {
str(catalogModele()$catalogs)
})
感谢阅读。
我将 R6
class 用于类似目的。也许看看这个会帮助你开发一个类似的设计以供参考classes
library(R6)
library(shiny)
myClass <- R6Class(
public = list(
catalogs = reactiveValues(),
add_catalog = function(key,value){
self$catalogs[[key]] <- value
}
)
)
A = myClass$new()
shinyApp(
fluidPage(
inputPanel(
textInput('key', 'key'),
textInput('value', 'value'),
actionButton('go', 'add')
),
verbatimTextOutput('textOut')
),
function(input, output, session){
observeEvent(input$go,
{ A$add_catalog(input$key, input$value) }
)
output$textOut <- renderPrint({
reactiveValuesToList(A$catalogs)
})
}
)
编辑:这是一个实际可行的解决方案。我只是将成员 reactives
从 R6
class 包装到一个列表中,并使其成为引用 class.
CatalogModele <- setRefClass(
"CatalogModele",
fields = list(catalogs = "list"),
methods = list(
initialize = function(catalogs_args = list()) {
catalogs <<- list(reactives = reactiveValues())
},
add_catalog = function(key, value) {
catalogs$reactives[[key]] <<- value
},
get_catalogs = function()
reactiveValuesToList(catalogs$reactives)
)
)
B = CatalogModele()
shinyApp(
fluidPage(
inputPanel(
textInput('key', 'key'),
textInput('value', 'value'),
actionButton('go', 'add')
),
verbatimTextOutput('textOut')
),
function(input, output, session){
observeEvent(input$go,
{ B$add_catalog(input$key, input$value) }
)
output$textOut <- renderPrint(B$get_catalogs())
}
)
在这两种情况下,建议只使 class 的某些部分具有反应性。否则,您的应用程序可能会遇到非常糟糕的性能。