R 闪亮:如何在日志中打印更新对象的名称?

R 闪亮:如何在日志中打印更新对象的名称?,r,shiny,R,Shiny,我尝试在日志中打印用户在应用程序中更新的输入。用observeEvent可以完成非常接近的事情 但我希望在日志中看到更新对象的名称,而不包含其值。怎么可能呢 if (interactive()) { library(shiny) library(futile.logger) library(glue) ui <- fluidPage( titlePanel("Sliders"), sidebarLayout( sidebarPanel(

我尝试在日志中打印用户在应用程序中更新的输入。用observeEvent可以完成非常接近的事情

但我希望在日志中看到更新对象的名称,而不包含其值。怎么可能呢

if (interactive()) {

  library(shiny)
  library(futile.logger)
  library(glue)

  ui <- fluidPage(

    titlePanel("Sliders"),

    sidebarLayout(

      sidebarPanel(

        sliderInput("integer", "Integer:",
                    min = 0, max = 1000,
                    value = 500),

        sliderInput("decimal", "Decimal:",
                    min = 0, max = 1,
                    value = 0.5, step = 0.1),

        sliderInput("range", "Range:",
                    min = 1, max = 1000,
                    value = c(200,500))

      ),

      mainPanel(

        tableOutput("values")

      )
    )
  )

  # Define server logic for slider examples ----
  server <- function(input, output) {

    observeEvent(c(input$integer, input$decimal, input$range), {

      flog.info(glue::glue('The user updated a value!'))

    })


    # Reactive expression to create data frame of all input values ----
    sliderValues <- reactive({

      data.frame(
        Name = c("Integer",
                 "Decimal",
                 "Range"),
        Value = as.character(c(input$integer,
                               input$decimal,
                               paste(input$range, collapse = " "))),
        stringsAsFactors = FALSE)

    })

    # Show the values in an HTML table ----
    output$values <- renderTable({
      sliderValues()
    })

  }

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

}

借助shiny:inputchanged事件的解决方案:

if (interactive()) {

  library(shiny)
  library(futile.logger)
  library(glue)

  ui <- fluidPage(

    titlePanel("Sliders"),

    sidebarLayout(

      sidebarPanel(

        sliderInput("integer", "Integer:",
                    min = 0, max = 1000,
                    value = 500),

        sliderInput("decimal", "Decimal:",
                    min = 0, max = 1,
                    value = 0.5, step = 0.1),

        sliderInput("range", "Range:",
                    min = 1, max = 1000,
                    value = c(200,500))

      ),

      mainPanel(

        tableOutput("values")

      )
    )
  )

  # Define server logic for slider examples ----
  server <- function(input, output) {

    observeEvent(c(input$integer, input$decimal, input$range), {

      flog.info(glue::glue('The user updated a value!'))

    })


    # Reactive expression to create data frame of all input values ----
    sliderValues <- reactive({

      data.frame(
        Name = c("Integer",
                 "Decimal",
                 "Range"),
        Value = as.character(c(input$integer,
                               input$decimal,
                               paste(input$range, collapse = " "))),
        stringsAsFactors = FALSE)

    })

    # Show the values in an HTML table ----
    output$values <- renderTable({
      sliderValues()
    })

  }

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

}
library(shiny)

js <- "
$(document).on('shiny:inputchanged', function(e) {
  if(e.name != 'updated' && e.name != '.clientdata_output_values_hidden'){
    Shiny.setInputValue('updated', e.name, {priority: 'event'});
  }
});"

ui <- fluidPage(

  tags$head(tags$script(HTML(js))),

  titlePanel("Sliders"),

  sidebarLayout(

    sidebarPanel(

      sliderInput("integer", "Integer:",
                  min = 0, max = 1000, value = 500),

      sliderInput("decimal", "Decimal:",
                  min = 0, max = 1, value = 0.5, step = 0.1),

      sliderInput("range", "Range:",
                  min = 1, max = 1000, value = c(200,500))

    ),

    mainPanel(
      tableOutput("values")
    )
  )
)

server <- function(input, output) {

  observeEvent(input$updated, {
    # do something with the name of the updated input, 
    # e.g  flog.info(glue::glue(input$updated))
    print(input$updated)
  })

  sliderValues <- reactive({
    data.frame(
      Name = c("Integer",
               "Decimal",
               "Range"),
      Value = as.character(c(input$integer,
                             input$decimal,
                             paste(input$range, collapse = " "))),
      stringsAsFactors = FALSE)
  })

  output$values <- renderTable({
    sliderValues()
  })

}

shinyApp(ui, server)