2016-11-11 6 views
0

Wie richte ich eine for-Schleife ein, die jedes Mal, wenn der Benutzer den Eingabewert ändert, mehrere reaktive Werte aktualisiert?For-Schleife zur Berechnung mehrerer reaktiver Variablen

Zum Beispiel sollte das Programm eine rohe Datei lesen. Basierend auf der Länge der Raw-Datei wird dann die for-Schleife mehrmals ausgeführt und jedes der beiden Zähler, die auf einer if-Anweisung basieren, wird aktualisiert. Jedes Mal, wenn der Benutzer den Eingabewert aktualisiert, sollten die Zähler entsprechend aktualisiert werden.

Unten habe ich versucht zu übersetzen, was ich in einem vereinfachten Format vorhabe.

Danke Jungs

my_data <- read.csv("whatever_raw_file.csv") 
counter_A <- 0 
counter_B <- 0 

for (i in 1:length(my_data)) { 
    if (my_data[i] > user_input_value) { 
    counter_A <- reactive({ 
     counter_A <- counter_A + 1 
     counter_A 
     }) 
    } 
    else { 
    counter_B <- reactive({ 
     counter_B <- counter_B + 1 
     counter_B 
    }) 
    } 
} 

Antwort

0

können Sie reactiveValues stattdessen verwenden.

Etwas wie:

my_data <- read.csv("whatever_raw_file.csv") 
counter <- reactiveValues(A = 0, B = 0) 

# inside some reactive expression 
for (i in 1:length(my_data)) { 
    if (my_data[i] > user_input_value) { 
    counter$A <- isolate(counter$A) + 1 
    } else { 
    counter$B <- isolate(counter$B) + 1 
    } 
} 
0

das ist also im Grunde ein Teil meiner app, die ich neu geschrieben und es scheint noch nicht zu arbeiten.

library(shiny) 
library(shinythemes) 

ui <- fluidPage(theme = shinytheme("sandstone"), 
navbarPage(title = "Project Methylation", 
    tabPanel(title = "Main", 
    wellPanel(
    column(4, 
     sliderInput("lowMethRangeS", "Low methylation range", min=0, max=1, value=c(0,0.4), step=0.01)), 
    column(4, 
     sliderInput("medMethRangeS", "Medium methylation range", min=0, max=1, value=c(0.4,0.6), step=0.01)), 
    column(4, 
     sliderInput("highMethRangeS", "High methylation range", min = 0, max = 1, value = c(0.6,1), step=0.01)))), 
    fluidRow(
    verbatimTextOutput("test"), 
    textOutput("test2") 
     ) 
     ) 
    ) 
    ) 

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

#This chunk of the code will connect the three sliders together to update automatically 
    observe({ 
    val1S <- input$lowMethRangeS 
    val2S <- input$medMethRangeS 
    updateSliderInput(session, "medMethRangeS", value =  c(val1S[2],val2S[2]), min = 0, max = 1, step = 0.01) 
    updateSliderInput(session, "highMethRangeS", value = c(val2S[2],1), min = 0, max = 1, step = 0.01) 
    }) 

    observe({ 
    val1P <- input$lowMethRangeP 
    val2P <- input$medMethRangeP 
    updateSliderInput(session, "medMethRangeP", value = c(val1P[2],val2P[2]), min = 0, max = 1, step = 0.01) 
    updateSliderInput(session, "highMethRangeP", value = c(val2P[2],1), min = 0, max = 1, step = 0.01) 
    }) 

#The next line is just to read the file 
    rawFileCoding <- read.csv(file = "coding.csv", header = TRUE, sep = ",") 

#This is the part I have problem with!!! 
    counters <- reactiveValues(
    CBLcounter = 0, 
    CPLcounter = 0, 
    CCLcounter = 0, 
    CNLcounter = 0 
) 

    for(i in 1:length(rawFileCoding$BEN)){ 
    if(rawFileCoding$BEN[i]>=input$lowMethRangeS[1] && rawFileCoding$BEN[i] <= input$lowMethRangeS[2]){ 
     counters$CBLcounter <- isolate(counters$CBLcounter) + 1 
     counters$CPLcounter <- isolate(counters$CPLcounter) + 1 
     counters$CCLcounter <- isolate(counters$CCLcounter) + 1 
     counters$CNLcounter <- isolate(counters$CNLcounter) + 1 
    } 
    } 

#I just added these two ways to just make sure the loop has worked 
    output$test <- renderPrint ({counters$CBLcounter}) 
    output$test2 <- renderText ({counters$CBLcounter}) 

} 
shinyApp(ui = ui, server = server) 
+0

@Geovany bitte sehen Sie sich das an. Danke im Voraus für Ihre Hilfe – sajjad6al