javascript - 如何格式化 Shiny updated numericInput 的输入但不更改实际值?

标签 javascript r shiny format numeric-input

在下面的示例中,numberInput“数字 C”被计算并更新为“数字 A”除以“数字 B”。当结果是无限小数时,这会导致一个有很多位数的数字到“数字 C”。我想将无限小数四舍五入到第二位或第三位数字,使“数字 C”的外观更易于阅读。然而,与此同时,我不想将 round 函数应用于 num_C 因为在现实世界中我想将“数字 C”应用于其他计算并且我想按原样使用该号码。换句话说,我想找到一种方法来格式化数字的外观而不是实际值,例如格式化 Excel 电子表格中的单元格以仅显示有限的数字而不更改实际值。这在 Shiny 中可以做到吗?

library(shiny)

# Define UI
ui <- fluidPage(
  numericInput(inputId = "A", "Number A", value = 2),
  numericInput(inputId = "B", "Number B", value = 3),
  numericInput(inputId = "C", "Number C [A/B]", value = 1)
)

# Server logic
server <- function(input, output, session){

  observe({
    req(input$A, input$B)
    num_C <- input$A/input$B
    updateNumericInput(
      inputId = "C",
      session = session,
      value = num_C
    )
  })
}

# Complete app with UI and server components
shinyApp(ui, server)

最佳答案

您可以为 num_C 使用 reactive 表达式

library(shiny)

# Define UI
ui <- fluidPage(
  numericInput(inputId = "A", "Number A", value = 2),
  numericInput(inputId = "B", "Number B", value = 3),
  numericInput(inputId = "C", "Number C [A/B]", value = 1)
)

# Server logic
server <- function(input, output, session){

  num_C <- reactive({
      req(input$A, input$B)
      input$A / input$B
  })

  observe(
      updateNumericInput(
          inputId = "C",
          session = session,
          value = format(num_C(), digits = 2))
      )

}

# Complete app with UI and server components
shinyApp(ui, server)

num_C() 将返回“未舍入”值,而我们在 中使用舍入值 format(num_C(), digits = 2) >更新数字输入


部分更新

为了它的值(value),这是一个不完整的更新

library(shiny)

# Define UI
ui <- fluidPage(
  numericInput(inputId = "A", "Number A", value = 2),
  numericInput(inputId = "B", "Number B", value = 3),
  numericInput(inputId = "C", "Number C [A/B]", value = 1),
  textOutput("value"),
  textOutput("rounded_value")
)

# Server logic
server <- function(input, output, session){

  num_C <- reactiveValues(
      value = NULL,
      rounded_value = NULL
  )

  observeEvent(input$A | input$B, {
      num_C$value <- input$A / input$B
      num_C$rounded_value <- round(num_C$value, 1)
  })

  observeEvent(input$C, {
      num_C$value <- input$C
      num_C$rounded_value <- input$C
  })

  output$value <- renderText(
      sprintf("Number C = %f", num_C$value)
  )
  output$rounded_value <- renderText(
      sprintf("Number C (rounded) = %f", num_C$rounded_value)
  )

}

# Complete app with UI and server components
shinyApp(ui, server)

想法是使用reactiveValues 来跟踪数字 C 的完整精度和舍入值。这在

  1. 通过 numericInput 更改数字 A、B 将在 textOutput 中正确计算(并显示)C 的完整精度和舍入数字。
  2. 通过 numericInput 更改数字 C 也会在 textOutput 中正确显示完整精度数字(等于四舍五入)。

但是,当数字 A 和 B 发生变化时,我使用 updateNumericInput 用四舍五入的数字更新 C 的值一直没有成功。

未完待续...

关于javascript - 如何格式化 Shiny updated numericInput 的输入但不更改实际值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55643980/

相关文章:

javascript - 为什么 ES6 “get” 没有 “Set” 方法?

r - 更改公式中变量的名称

html - Shiny 应用程序的导航栏干扰 rmarkdown 网页的导航栏

r - 如何保留使用 rvest 抓取的页面的格式

r - Shiny DT - 使用按钮选择选定行后的行

javascript - 播放视频 ID : React 数组中的 YouTube 视频

javascript - 禁词审查制度

r - 如何使用 facet_grid 在 ggplot2 中显示不同次数的多项式拟合?

linux - 提取值与特定模式匹配的列

javascript - jquery 事件委托(delegate)与 iframe