首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类R中的无功场

类R中的无功场
EN

Stack Overflow用户
提问于 2017-07-12 16:31:54
回答 1查看 427关注 0票数 0

是否可以在类中创建一个反应性字段,或者在其字段更改时通知应用程序的类?

我得到了这个类,它是我的shinyApp的模型:

代码语言:javascript
复制
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()“时,我想更新一些闪亮的小部件。我试过这个:

代码语言:javascript
复制
catalogModele <<- reactive({CatalogModele()})
on.exit(rm(catalogModele, pos = ".GlobalEnv"))

但当我观察我的变量时,什么都不会发生:

代码语言:javascript
复制
observeEvent(catalogModele(), {
    str(catalogModele()$catalogs)
})

感谢您的阅读。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-12 21:52:18

我使用R6类是为了类似的目的。也许这将帮助您为参考类开发类似的设计。

代码语言:javascript
复制
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)
    })
  }
)

编辑:这是一个实际的工作解决方案。我刚刚将成员reactivesR6类包装成一个列表,并使它成为引用类的成员。

代码语言:javascript
复制
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())
  }
)

在这两种情况下,最好只是使类的某些部分具有反应性。否则,您可能会遇到非常糟糕的性能在您的应用程序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45063205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档