2017-09-12 8 views
0

あるモジュールのリアクティブ関数にアクセスする方法を知りたいと思います。 1つのモジュールに複数のリアクティブ関数がある場合、別のモジュールでそれぞれにアクセスできますか?別の光沢のあるモジュール(あるモジュールから別のモジュールへのリアクティブ関数)で光るモジュールを呼び出す方法

だから、基本的に私は(他の1つのモジュールからの反応性機能)別の光沢のあるモジュールに1つの光沢のあるモジュール内の反応関数を渡す/呼び出す方法 おかげ

module1Ui <- function(id) { 
     ns <- NS(id) 

     wellPanel(
     selectInput( 
      ns('cars'), "cars:", list("Select" = "", "a" = "mazda", "b" = "ford")) 

    ) } 


    module1<-function(input, output, session){ 
     dataone = reactive({ 
     if(input$cars=="mazda"){ mtcars$mpg} 
     else(mtcars$hp) 
     }) 

    } 
    module2<-function(input, output, session){ 
     dataone() 
     #here I want dataone from the above module1 
     # I tried to use callmodule(module1,_) but then didnt understand what the id would be in this case? 

    } 

    library(shiny) 

    ui <- fluidPage( sliderInput("slider","how much cars?", 1, 10, 1, width   = "100%"), 
     uiOutput("selectors"), 
     verbatimTextOutput("datap") 
    ) 

    server <- function(input, output, session){ 
     for(i in 1:10) 
     callModule(module1, i) 



     output$selectors <- renderUI({ 
     lapply(1:input$slider, module1Ui) 
     }) 

     #below code just to test if I was able to correctly get dataone()  #from module2 
     output$datap<-renderPrint(
     lapply(1:input$slider, function(i){ datas<-callModule(module2,i) 


     datas()}) 

    ) 


    } 

    shinyApp(ui, server) 

おかげ

答えて

2

あなたがする必要がありますモジュール内でreturnを使用して、リアクティブなものをアプリまたはネストされたモジュールを呼び出すモジュールに返します。呼び出し元レイヤーでは、<-を使用して戻り値を割り当てます。次に、ネストされたモジュールを呼び出すレイヤーで使用できます。返信用

module1Ui <- function(id) { 
    ns <- NS(id) 

    wellPanel(
    selectInput(ns('cars'), "Select", c("mpg", "hp")) 
)} 


module1 <- function(input, output, session){ 
    dataone <- reactive({ 
    req(!is.null(input$cars)) 
    return(input$cars) 
    }) 

    # return dataone so that it is visible in the app 
    return(dataone) 

} 
module2<-function(input, output, session, dataone){ 
    # if you want to use dataone() here, you need to do so in a reactive context, e.g. observe, render*, ... 
    observeEvent(dataone(), { print(dataone()) }) 

    # return dataone so that it is visible in the app 
    return(dataone) 
} 

library(shiny) 

ui <- fluidPage( sliderInput("slider","how much cars?", 1, 10, 1, width   = "100%"), 
        uiOutput("selectors"), 
        verbatimTextOutput("datap") 
) 

server <- function(input, output, session){ 

    # create a list for all dataone-Vectors 
    dataones <- list() 
    for(i in 1:10) 
    # fill the list with each dataone 
    dataones[[i]] <- callModule(module1, i) 

    output$selectors <- renderUI({ 
    lapply(1:input$slider, module1Ui) 
    }) 

    #below code just to test if I was able to correctly get dataone()  #from module2 
    output$datap<-renderPrint({ 
    lapply(1:input$slider, function(i){ 
     datas <- callModule(module2,i, dataones[[i]]) 
     return(paste("Input", i, "returned", datas())) 
    }) 
    }) 
} 

shinyApp(ui, server) 

enter image description here

+0

おかげで、しかし、モジュール2で、私はまだカント使用Dataoneの():作業の例を参照してください。私はmodule2でdataone()を使って何らかの計算をしたいとします。例えば。 abc <-dataone()$ var1 – shamary

+0

あなたは反応的な文脈の中でそれを使う必要があります。私のコードを更新しました。 – shosaco

関連する問題