Shiny / R-无法重命名列标题

时间:2018-12-06 01:03:12

标签: r shiny

希望获得一些专业知识。以下代码段执行以下操作:

  1. 允许用户从CSV文件中选择所需的变量(列),然后为每个变量生成数字输入字段。
  2. 使用用户输入的值填充数据框。

但是,Shiny将列标题分配给数据框,并且我已经尝试了一切可能的方法来更改它们,但似乎没有任何效果。

有人可以告诉我我在做什么错吗?

df_sel()-这是选择变量的函数

这是R.UI部分

ui <- fluidPage(

  # App title ----
  titlePanel(title = h1("Variable Selection Example", align = "center")),

  # Sidebar layout with input and output definitions ----
  sidebarLayout(

  # Sidebar panel for inputs ----
  sidebarPanel(

  # Input: Select a file ----
  fileInput("uploaded_file", "Choose CSV File",
            multiple = TRUE,
            accept = c("text/csv",
                       "text/comma-separated-values,text/plain",
                       ".csv")),


  # Horizontal line ---- This allows the user to create a bunch of repeated values for the numerica inputs they later create
  sliderInput("months", "Forecast Months:",
              min = 0, max = 60,
              value = 1),
  tags$hr(),

  # Input: Checkbox if file has header ----
  checkboxInput("header", "Header", TRUE),


  # Input: Select separator ----
  radioButtons("sep", "Separator",
               choices = c(Semicolon = ";",
                           Comma = ",",
                           Tab = "\t"),
               selected = ","),


  # Horizontal line ----
  tags$hr(),

  # Input: Select number of rows to display ----
  radioButtons("disp", "Display",
               choices = c(All = "all",
                           Head = "head"),
               selected = "all"),

  # Select variables to display ----
  uiOutput("checkbox")


),

# Main panel for displaying outputs ----
mainPanel(
  uiOutput("input_ui"),  #numeric inputs
  tableOutput("table1")) #table to display input values
)
)

这在R.Server部分中

  server <- function(input, output, session) {


  #assign csv file to dataframe  df  
  df <- reactive({
   req(input$uploaded_file)
   read.csv(input$uploaded_file$datapath,
       header = input$header,
       sep = input$sep)  

   })

  # Dynamically generate UI input when data is uploaded ----
  output$checkbox <- renderUI({
  checkboxGroupInput(inputId = "select_var", 
                   label = "Select variables", 
                   choices = setdiff(names(df()), input$select_dev),
                   selected = setdiff(names(df()), input$select_dev))
 })

 # Select columns to print ----
 df_sel <- reactive({
 req(input$select_var)
 df_sel <- df() %>% select(input$select_var) 
 })


 output$input_ui <- renderUI({   #this creates dynamic numeric inputs based on the variables selected by the user
pvars <- df_sel()
varn = names(df_sel())
lapply(seq(pvars), function(i) {
  numericInput(inputId = paste0("range", pvars[i]),
               label = varn,
               value = 0)
  })

})

 numbers <- reactive({  #this creates a reactive dataframe for the numbers
  pvars <- df_sel()
  num = as.integer(ncol(pvars))
  print(num)
  pred <- data.frame(lapply(1:num, function(i) {
    input[[paste0("range", pvars[i])]]

}))

n = input$months  #pull number from that slider up in the UI section
pd = data.frame(pred, i=rep(1:n,ea=NROW(input$months)))
pd[1:(length(pd)-1)]
#colnames(pd, c(df_sel()))  #this does not seem to work at all!!!

 })

output$table1 <- renderTable({
   numbers()
   fv = numbers()
   print(dim(fv))  #check the dimensions of the table
   print(fv) # chcek the table is populating correctly.
   #df1 <- fv #show the table

 })
}  

# Create Shiny app ----
shinyApp(ui = ui, server = server)

1 个答案:

答案 0 :(得分:0)

我想出了一个解决自己问题的方法。如果有人可以改进它,请告诉我。此代码在R.Server部分中。

 #This creates sliders from the selected variables from the reactive function called
 #"df_sel()".  Note the use of "tagList".  The RenderUI function below creates as 
 #many sliders as variables selected, and passes in the correct variable name.  
 #It selects the last data value from each column, since this is time series data,
 #the last data value \ (most recent) was desired.  

 output$scplan <- renderUI({  
    vars <- df_sel()
    n = nrow(vars)
    tagList(lapply(colnames(vars), function(z) {
       sliderInput(
       sprintf("%s",z),
       label = z,
       min = ceiling(min(vars[[z]])), # min value is the minimum of the column
       max = ceiling(max(vars[[z]])), # max is the max of the column
       value = vars[[z]][[n]])
    }))     


 #this reactive function creates a dataframe from variables that were selected from 
 #checkboxes.  The user moves the sliders to generate the values, and the code 
 #repeats the values for as many "input$months" as were selected. 

 sp_numbers <- reactive({
   vars <- df_sel()
   num = as.integer(ncol(vars))
   sp_pred <- data.frame(lapply(colnames(vars), function(z) {
   input[[z]]
     }))
   names(sp_pred) <- colnames(vars)
   n = input$sp_months
   df_sp_pred = data.frame(sp_pred, z=rep(z:n,ea=NROW(input$sp_months)))
   df_sp_pred[1:(length(df_sp_pred)-1)] #this removes the last column which just shows the repeat count
  })

#this code renders the table of the dataframe created above. 
output$spo_table <- renderTable({ 
  sp_numbers()
  })
相关问题