R Shiny:反应列名称带有mutate吗?

时间:2019-09-12 11:51:00

标签: r shiny

在我的反应式数据框中,一列有一个反应式名称(由用户选择),我想生成一列,其值是原始列的对数。为此,我在mutate包中使用了dplyr。但是,当我尝试使此新列的名称具有反应性时,会出现错误。

例如,在下面的代码中,我将新列命名为“对数”,它可以正常工作:

library(shiny)
library(DT)
library(data.table)
library(dplyr)

ui <- fluidPage(
  titlePanel(""),
  fluidRow(
    checkboxInput(inputId = "logarithm",
                  label = "Log(variable)"),
    dataTableOutput("my_df"),
    textInput("new_name", 
              label = "New_name"),
    actionButton("new_name2", "Validate")
  )
)


server <- function(input, output) {

  data <- head(mtcars[, 1:3])


  reactive_data <- eventReactive(input$new_name2, {
    colnames(data) <- c("mpg", "cyl", input$new_name)
    data
  }) 

  output$my_df <- renderDataTable({
    data <- reactive_data()
      if(input$logarithm){
        data %>%
          mutate(logarithm = log(data[, input$new_name]))

      }
    else {
      data
    }
  })
}

shinyApp(ui = ui, server = server)

但是将“ logarithm”改为“ logarithm(input $ new_name)”,它将不再起作用。

有人有解决方案吗?

1 个答案:

答案 0 :(得分:1)

基于此question and answer

if(input$logarithm){
        log_name <- paste0('logarithm(', input$new_name, ')')
        data %>%
          mutate(!!log_name := log(data[, input$new_name]))

}

完整代码:

library(shiny)
library(DT)
library(data.table)
library(dplyr)

ui <- fluidPage(
  titlePanel(""),
  fluidRow(
    checkboxInput(inputId = "logarithm",
                  label = "Log(variable)"),
    dataTableOutput("my_df"),
    textInput("new_name", 
              label = "New_name"),
    actionButton("new_name2", "Validate")
  )
)


server <- function(input, output) {

  data <- head(mtcars[, 1:3])


  reactive_data <- eventReactive(input$new_name2, {
    colnames(data) <- c("mpg", "cyl", input$new_name)
    data
  }) 

  output$my_df <- renderDataTable({
    data <- reactive_data()
    if(input$logarithm){
            log_name <- paste0('logarithm(', input$new_name, ')')
            data %>%
              mutate(!!log_name := log(data[, input$new_name]))

    }
    else {
      data
    }
  })
}

shinyApp(ui = ui, server = server)