Как добавить новые столбцы в определенную позицию в фрейме данных в зависимости от выбора пользователя в Shiny?

#r #dataframe #input #shiny #cbind

Вопрос:

Я пытаюсь создать блестящее приложение, в котором вы можете выбрать, какие столбцы вы хотите добавить. Чтобы выбрать столбцы, я использовал checkboxGroupInput, чтобы иметь возможность добавлять их все (или более 1), если пользователь хочет.

Исходный кадр данных без новых столбцов выглядит следующим образом:

 var1<-rep(c(1:4),3)
var2<-c('a','b','c','a','b','c','a','b','c','a','b','c')
var3<-c(1,2,3,1,23,14,15,12,23,20,21,22)
var4<-c(23,23,1,2,3,14,15,20,21,22,23,45)
df<-data.frame(var1,var2,var3,var4)

> df
   var1 var2 var3 var4
1     1    a    1   23
2     2    b    2   23
3     3    c    3    1
4     4    a    1    2
5     1    b   23    3
6     2    c   14   14
7     3    a   15   15
8     4    b   12   20
9     1    c   23   21
10    2    a   20   22
11    3    b   21   23
12    4    c   22   45
 

И конечный кадр данных (если пользователь выберет все НОВЫЕ столбцы) будет таким, с этими точными позициями.

 #New columns
col1 <-rep(c("Name"),12)
col2 <- rep(c("Function"),12)
col3 <- rep(c(4:7),3)

final_df <- data.frame(col1,col2,col3,var1,var2,var3,var4)

> final_df
   col1     col2 col3 var1 var2 var3 var4
1  Name Function    4    1    a    1   23
2  Name Function    5    2    b    2   23
3  Name Function    6    3    c    3    1
4  Name Function    7    4    a    1    2
5  Name Function    4    1    b   23    3
6  Name Function    5    2    c   14   14
7  Name Function    6    3    a   15   15
8  Name Function    7    4    b   12   20
9  Name Function    4    1    c   23   21
10 Name Function    5    2    a   20   22
11 Name Function    6    3    b   21   23
12 Name Function    7    4    c   22   45
 

Однако, если пользователь хочет видеть только col1 и col3, я хочу видеть этот порядок (первый col1 и второй col3). То же самое и с другими комбинациями.

Я много искал о том, как это сделать, но я все еще не знаю, как добавить их в нужное мне положение (а не в конце).

Теперь мой код добавляет их, но только если вы выбираете только один за другим.

1

Если вы выберете более 1, вы не увидите более 1 нового столбца во фрейме данных.

2

Кто-нибудь может мне в этом помочь?

Большое спасибо

Код:

 library(shiny)
library(DT)

####DATA
var1<-rep(c(1:4),3)
var2<-c('a','b','c','a','b','c','a','b','c','a','b','c')
var3<-c(1,2,3,1,23,14,15,12,23,20,21,22)
var4<-c(23,23,1,2,3,14,15,20,21,22,23,45)
df<-data.frame(var1,var2,var3,var4)

### NEW COLUMNS THAT I WANT TO ADD
col1 <-rep(c("Name"),12)
col2 <- rep(c("Function"),12)
col3 <- rep(c(4:7),3)


#### SHINY APP
ui <- fluidPage(
  
  titlePanel("My table"),
  
  sidebarLayout(
    sidebarPanel(
      
      radioButtons("OptionToDo", "What do you want to do?",
                   c("See the table" = "table",
                     "See more columns in the table" = "new_columns")),
      
      
      conditionalPanel(
        condition = "input.OptionToDo == 'new_columns'",
        checkboxGroupInput("new_col", "What columns do you want to add to the table?",
                           c("col1" = "col1",
                             "col2" = "col2",
                             "col3" = "col3")))
      
    ),
    
    mainPanel(
      dataTableOutput("table"),
      
    )
  )
)
# Define server logic required to draw a histogram
server <- function(session, input, output) {
  
  new_df <- reactive({
    data <- df
    
    if(input$OptionToDo == 'new_columns'){
      data <- df
      
      if(input$new_col == "col1"){
        data <- cbind(Name = col1, df)
      }
      
      if(input$new_col == "col2"){
        data <- cbind(Func = col2, df)
      }
      
      if(input$new_col == "col3"){
        data <- cbind(Numb = col3, df)
      }
      return(data)
      
    }
    return(data)
    
  })
  
  output$table<- renderDataTable({
    new_df()
  })
  
}

# Run the application 
shinyApp(ui = ui, server = server)
 

Ответ №1:

Вместо того, чтобы эти векторы отдельно включали их в фрейм данных. Проще выбрать столбцы из фрейма данных. Попробуйте этот подход —

 library(dplyr)
library(shiny)
library(DT)

####DATA
var1<-rep(c(1:4),3)
var2<-c('a','b','c','a','b','c','a','b','c','a','b','c')
var3<-c(1,2,3,1,23,14,15,12,23,20,21,22)
var4<-c(23,23,1,2,3,14,15,20,21,22,23,45)
col1 <-rep(c("Name"),12)
col2 <- rep(c("Function"),12)
col3 <- rep(c(4:7),3)
df<-data.frame(col1, col2, col3,var1,var2,var3,var4)

#### SHINY APP
ui <- fluidPage(
  titlePanel("My table"),
  sidebarLayout(
    sidebarPanel(
      radioButtons("OptionToDo", "What do you want to do?",
                   c("See the table" = "table",
                     "See more columns in the table" = "new_columns")),
      conditionalPanel(
        condition = "input.OptionToDo == 'new_columns'",
        checkboxGroupInput("new_col", "What columns do you want to add to the table?",
                           c("col1" = "col1",
                             "col2" = "col2",
                             "col3" = "col3")))
      
    ),
    mainPanel(
      dataTableOutput("table"),
    )
  )
)
# Define server logic required to draw a histogram
server <- function(session, input, output) {
  new_df <- reactive({
    data <- df %>% select(var1:var4)
    if(input$OptionToDo == 'new_columns'){
      data <- df %>% select(all_of(input$new_col), var1:var4)
      return(data)
    }
    return(data)
  })
  
  output$table<- renderDataTable({
    new_df()
  })
}

# Run the application 
shinyApp(ui = ui, server = server)
 

Комментарии:

1. Вот что мне было нужно! Большое спасибо!