2016-09-28 65 views
0

我有光澤的應用程序等如下所示:如何根據下拉輸入動態地重命名R Shiny中的多列?

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) 

目的是重命名數據幀(mtcars)其中,I具有給定的最終數據的一些標準名稱,並且用戶應該選擇的列來自輸入數據集的相應變量。例如,我想將用戶選擇的某個列(本例中爲mpg)重命名爲「里程」,將cyl重命名爲「Cylinder」等。

我的問題是我無法重新命名多個列。只有第一列正在重命名,而不是剩下的。

其次,我可能不會選擇任何列,在這種情況下,列名不必改變,也就是說,如果沒有選擇MPG那麼就應該繼續作爲mpg

我如何獲得的所有列根據改名到我設定的名字,基於用戶輸入?

如果我選擇所有下拉列表,則重命名會很好。

回答

1

爲什麼不簡單?

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

或者可能是我不明白你的目標......

閃亮的例子

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) 

或者,如果你想用文字輸入重命名colums你可以這樣的方式

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) 
相關問題