2016-09-28 33 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) 
相关问题