2017-09-12 6 views
0

Ich würde gerne wissen, wie man reaktive Funktionen in einem Modul auf ein anderes Modul zugreifen kann. Wenn ich in einem Modul mehr als eine reaktive Funktion habe, kann ich dann in einem anderen Modul auf sie zugreifen?wie man ein glänzendes Modul in einem anderen glänzenden Modul nennt (reaktive Funktion von einem Modul zum anderen)

Also im Grunde wie würde ich rufen/pass eine reaktive Funktion in einem glänzenden Modul zu einem anderen glänzenden Modul (reaktive Funktion von einem Modul zum anderen) Dank

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) 

Dank

Antwort

2

Sie müssen Verwenden Sie im Modul return, um das reaktive Element an die App oder das Modul zurückzugeben, das Ihr verschachteltes Modul aufruft. Verwenden Sie im aufrufenden Layer <-, um den zurückgegebenen Wert zuzuweisen. Dann ist es in der Ebene verwendbar, die das verschachtelte Modul aufruft. Siehe das Arbeitsbeispiel:

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

Danke für die Antwort, aber ich kann immer noch nicht Gebrauch DataOne() in module2. Angenommen, ich möchte in modul2 eine Berechnung mit dataone() durchführen. z.B. abc <-dataone() $ var1 – shamary

+0

Sie müssen es in einem reaktiven Kontext verwenden. Mein Code wurde aktualisiert. – shosaco

Verwandte Themen