2016-09-28 2 views
0

Ich habe eine glänzende App wie unten dargestellt:Wie werden mehrere Spalten in R Shiny basierend auf Dropdown-Eingaben dynamisch umbenannt?

require(shiny) 
require(dplyr) 
server <- function(input, output) { 

    dataa <- reactive({ 
    table1 <- mtcars 
    return(table1) 
    }) 

    output$contents <- renderDataTable({ 
    dataa()  
    }) 

    output$mpg <- renderUI({ 
    selectizeInput(
     'MPG', 'MPG: ', choices = c("",as.list(colnames(dataa()))), 
     options = list(
     placeholder = 'Please select', 
     onInitialize = I('function() { this.setValue(""); }') 
    ) 
    ) 
    }) 

    output$cyl <- renderUI({ 
    selectizeInput(
     'CYL', 'CYL: ', choices = c("",as.list(colnames(dataa()))), 
     options = list(
     placeholder = 'Please select', 
     onInitialize = I('function() { this.setValue(""); }') 
    ) 
    ) 
    }) 


    DataRename <- reactive({ 
    Data <- dataa() 
    DataNew1<-Data 
    MPG <- input$MPG 
    CYL <- input$CYL 
    if(!is.null(MPG)){ 
     StatRenameEmp1 <- paste0("DataNew1 <- dplyr::rename(DataNew1,Mileage=",MPG,")") 
     eval(parse(text=StatRenameEmp1)) 
    } else{ 
     DataNew1<-Data 
    } 
    if(!is.null(CYL)){ 
     StatRenameEmp1 <- paste0("DataNew1 <- dplyr::rename(DataNew1,Cylinders=",CYL,")") 
     eval(parse(text=StatRenameEmp1)) 
    }else{ 
     DataNew1<-Data 
    } 

    return(DataNew1) 
    }) 

    output$rename <- renderDataTable({ 
    DataRename()  
    }) 


} 

ui <- shinyUI({ 
    navbarPage("Dynamic Rename", 
      tabPanel("Data", 
         fluidPage(
         titlePanel("mtcars"), 

         dataTableOutput('contents')) 
        ), 
      tabPanel("Variables", 
         fluidPage(
         sidebarLayout(
          sidebarPanel(
          uiOutput("mpg"), 
          uiOutput("cyl") 
         ), 
          mainPanel(
          dataTableOutput("rename") 
         ) 
         ) 
        ) 
    ) 


) 



}) 

shinyApp(ui = ui, server = server) 

Das Ziel ist es, die Spalten des Datenrahmen (mtcars), wo ich einige Standard-Namen zu den endgültigen Daten und der Benutzer der Auswahl sollte gegeben umbenennen entsprechende Variable aus dem Eingabe-Dataset. ZB. Ich möchte eine bestimmte vom Benutzer ausgewählte Spalte (mpg in diesem Fall) als "Kilometerstand", cyl zu "Zylinder" usw. umbenennen.

Mein Problem ist, dass ich mehrere Spalten auf einmal nicht umbenennen kann. Nur die erste Spalte wird umbenannt, nicht die verbleibende.

Zweitens kann ich keine Spalte auswählen, in diesem Fall der Spaltenname nicht geändert werden muss, das heißt, wenn MPG dann nicht gewählt wird, sollte es als mpg

bleiben Wie kann ich alle bekommen die Spalten umbenannt nach zu einem von mir festgelegten Namen, basierend auf den Benutzereingaben?

Die Umbenennung funktioniert gut, wenn ich alle Dropdowns auswähle.

Antwort

1

Warum nicht einfach?

colnames(df)[which(colnames(df)=="mpg")]="New name" 

Oder kann ich Ihre Ziele nicht versteht ...

Glänzendes Beispiel

require(shiny) 
require(dplyr) 
server <- function(input, output) { 

    dataa <- reactive({ 
    table1 <- mtcars 
    return(table1) 
    }) 

    output$contents <- renderDataTable({ 
    dataa()  
    }) 

    output$mpg <- renderUI({ 
    selectizeInput(
     'MPG', 'MPG: ', choices = c("",as.list(colnames(dataa()))), 
     options = list(
     placeholder = 'Please select', 
     onInitialize = I('function() { this.setValue(""); }') 
    ) 
    ) 
    }) 

    output$cyl <- renderUI({ 
    selectizeInput(
     'CYL', 'CYL: ', choices = c("",as.list(colnames(dataa()))), 
     options = list(
     placeholder = 'Please select', 
     onInitialize = I('function() { this.setValue(""); }') 
    ) 
    ) 
    }) 


    DataRename <- reactive({ 
    Data <- dataa() 
    DataNew1<-Data 
    MPG <- input$MPG 
    CYL <- input$CYL 

    if(!is.null(MPG)){ 
     colnames(DataNew1)[which(colnames(DataNew1)==MPG)]="Mileage" 
    } 

    if(!is.null(CYL)){ 
     colnames(DataNew1)[which(colnames(DataNew1)==CYL)]="Cylinders" 
    } 

    return(DataNew1) 
    }) 

    output$rename <- renderDataTable({ 
    DataRename()  
    }) 


} 

ui <- shinyUI({ 
    navbarPage("Dynamic Rename", 
      tabPanel("Data", 
         fluidPage(
         titlePanel("mtcars"), 

         dataTableOutput('contents')) 
      ), 
      tabPanel("Variables", 
         fluidPage(
         sidebarLayout(
          sidebarPanel(
          uiOutput("mpg"), 
          uiOutput("cyl") 
         ), 
          mainPanel(
          dataTableOutput("rename") 
         ) 
         ) 
        ) 
      ) 


) 



}) 

shinyApp(ui = ui, server = server) 

Oder wenn Sie die Texteingabe verwenden möchten colums umbenennen Sie es in einer solchen Art und Weise tun können

require(shiny) 
require(dplyr) 
server <- function(input, output) { 

    dataa <- reactive({ 
    table1 <- mtcars 
    return(table1) 
    }) 

    output$contents <- renderDataTable({ 
    dataa()  
    }) 

    output$renamer <- renderUI({ 
    lapply(colnames(dataa()),function(i){ 
     textInput(paste0("col_",i),i,i) 
    }) 
    }) 


    DataRename <- reactive({ 
    Data <- dataa() 
    DataNew1<-Data 

    for (i in names(input)){ 

     if(grepl(pattern = "col_",i)){ 
     colnames(DataNew1)[which(colnames(DataNew1)==substr(i,5,nchar(i)))]=input[[i]] 
     } 

    } 

    return(DataNew1) 
    }) 

    output$rename <- renderDataTable({ 
    DataRename()  
    }) 


} 

ui <- shinyUI({ 
    navbarPage("Dynamic Rename", 
      tabPanel("Data", 
         fluidPage(
         titlePanel("mtcars"), 

         dataTableOutput('contents')) 
      ), 
      tabPanel("Variables", 
         fluidPage(
         sidebarLayout(
          sidebarPanel(

          uiOutput("renamer") 
         ), 
          mainPanel(
          dataTableOutput("rename") 
         ) 
         ) 
        ) 
      ) 


) 



}) 

shinyApp(ui = ui, server = server) 
Verwandte Themen