2016-03-21 5 views
1

Ich habe 140 renderUI, die ich Objekte zuweisen möchten. Man könnte dies wie dies manuell tun:Verwenden Sie Eingabe Ausdruck in Paste0-Funktion in Shiny R

Filter1 <- input$Filter1 
... 
Filter140 <- input$Filter140 

ich dies automatisiert haben will, aber ich kann die input$Filter1 nicht bekommen: input$Filter140 in einem paste0. Ich habe das versucht:

Filters<-c() 
for(i in 1:140){ 
    Filters<-c(paste0('Filter',i),Filters) 
} 
for(i in Filters){ 
assign(i,input[[paste0(i)]]) 
} 

die ich teilweise von this other SO question bekam. Aber es funktioniert nicht .. Jede Hilfe wäre willkommen.

ps. lassen Sie mich wissen, wenn Sie eine volle ui.r und server.r Beispiel benötigen. Obwohl ich denke, das ist genug Information.

+1

Diese belanglos sein könnte, aber Sie verwenden eine Hauptstadt 'F' im unteren Block von Code und einen Kleinbuchstaben 'f' im höheren Code-Block. Sagt es, dass es 'filter1' nicht finden kann? – giraffehere

+0

Danke, ich schrieb den ersten Block nur schnell, aber es verursacht nicht meinen Fehler. Ich habe den Schnitt gemacht. –

+1

Wo brauchst du den 'Filterx'? Kannst du nicht vermeiden, diese Variable zu verwenden, indem du einfach 'input [[paste0 (Filter, x)]] 'irgendwo anrufst, wo du' Filterx' gerufen hättest? –

Antwort

0

Also ich glaube, assign verhält sich nicht mit Datenrahmen, wie Sie es wollen. Versuchen Sie folgendes:

Filters <- c() 
input <- data.frame(x = "") 
for (i in 1:140) { 

    Filters <- c(paste0('Filter', i), Filters) 

} 

tail(Filters) 
head(Filters) 

for (i in Filters) { 

    input[[i]] <- i 

} 

input <- input[, -1] 

Wenn Sie die Spalten in die entgegengesetzte Richtung erstellt werden soll, ändern Sie die Zeile:

Filters <- c(paste0('Filter', i), Filters) 

zu

Filters <- c(Filters, paste0('Filter', i)) 
+0

Eingabe ist kein 'dat.frame', es wird mit Shiny erstellt. Bist du sicher, dass es damit funktionieren sollte? –

+0

Und ich brauche die Objekte Filter1 bis Filter140, nicht alle Werte in einem 'dat.frame'. –

+0

@Tim_Utrecht Ah, okay, ich bin nicht ganz vertraut mit glänzend, aber ist eine Art von Array eingegeben, die Sie zugreifen können? Die Syntax scheint einem Datenrahmen sehr ähnlich zu sein. Und bekommen Sie auch irgendeinen Fehler? – giraffehere

0

Nach etwas mehr untersuchen es tat scheinen mit der assign() und input[[paste0(i)]] Funktion zu arbeiten: ui.r:

library(shiny) 

shinyUI(fluidPage(

    # Application title 
    titlePanel("Old Faithful Geyser Data"), 

    # Sidebar with a slider input for number of bins 
    sidebarLayout(
    sidebarPanel(
     sliderInput("bins", 
        "Number of bins:", 
        min = 1, 
        max = 50, 
        value = 30) 
    ), 


    # Show a plot of the generated distribution 
    mainPanel(
     selectInput("Filter1","Filter1",choices = c("A","B","C"),selected = "A"), 
     selectInput("Filter2","Filter2",choices = c("AB","BC","CD"),selected = "AB"), 
     selectInput("Filter3","Filter3",choices = c("ABC","BCD","CDF"),selected = "ABC"), 
     plotOutput("distPlot") 
    ) 
) 
)) 

server.r:

library(shiny) 

shinyServer(function(input, output) { 

    output$distPlot <- renderPlot({ 

    # generate bins based on input$bins from ui.R 
    x <- faithful[, 2] 
    bins <- seq(min(x), max(x), length.out = input$bins + 1) 
    #Filter1<-input$Filter1 
    #print(Filter1) 
    #print(input$Filter2) 
    for(i in c("Filter1","Filter2","Filter3")){ 
    #Filter3 <- input[[paste0('Filter3')]] 
    assign(i,input[[paste0(i)]]) 
     print(get(i)) 
    } 
    # draw the histogram with the specified number of bins 
    hist(x, breaks = bins, col = 'darkgray', border = 'white') 



    }) 

})