2017-07-12 2 views
0

フィールドが変更されたときにクラスに反応フィールドを作成することはできますか?私は私は私のグローバルオブジェクトの「add_catalogを()」を使用する場合、いくつかの光沢のあるウィジェットを更新したいと思いますクラスの反応フィールドがぼやけているR

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 
    } 
) 
) 

は、私は私のshinyAppためのモデルである、このクラスを得ました。私はこの試みた:

catalogModele <<- reactive({CatalogModele()}) 
on.exit(rm(catalogModele, pos = ".GlobalEnv")) 

をしかし、私は私の変数を観察するとき何も起こりません:読書のための

observeEvent(catalogModele(), { 
    str(catalogModele()$catalogs) 
}) 

感謝を。

答えて

0

私は同様の目的のためにR6クラスを使用します。ここでは、実際の作業溶液は次のとおりです。多分これを見ると、あなたが参照クラス

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) 
    }) 
    } 
) 

EDITのための同様のデザインを開発するのに役立ちます。私はちょうどR6クラスのメンバーreactivesをリストにラップして、それを参照クラスのメンバーにしました。

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()) 
    } 
) 

どちらの場合でも、クラスの特定の部分を反応させることをお勧めします。そうしないと、アプリのパフォーマンスが非常に低下する可能性があります。

関連する問題