如何格式化R Shiny numericInput?

时间:2018-08-10 18:13:03

标签: shiny formatting

我有一个包含许多numericInput字段的Shiny应用程序。我想要一种格式化numericInput字段的方式,并用逗号分隔每10 ^ 3。例如,我要5,000,000而不是5000000。

我可以使用formatprettyNum函数在R中执行此操作。但是我没有办法在Shiny中做到这一点。

这对UI很有帮助,因为它可以与百分比,金钱等一起使用。有人知道如何将其合并到numericInput字段中吗?

谢谢!

library(shiny)

# Define UI for application that draws a histogram
ui <- fluidPage(
  mainPanel(
    numericInput("formatNumber",
                 "Number should be formatted, e.g."5,000,000",
                 value = 1000),
    p(format(5000000.10, big.mark=",", big.interval=3L,
             digits=0, scientific=F))
  )
)

server <- function(input, output) {  
}

shinyApp(ui = ui, server = server)

3 个答案:

答案 0 :(得分:1)

我找不到任何可以帮助numericInput()的东西,但是这里是textInput()可以使用的方法。

library(shiny)

if(interactive()){
  shinyApp(
    ui <- fluidPage(
      mainPanel(
        textInput("formatNumber1", "Number should be formatted, e.g.5,000,000", value = 1000),
        textInput("formatNumber2", "Number should be formatted, e.g.5,000,000", value = 1000)
      )
    ),

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

      observe({
        updateTextInput(session, "formatNumber1", "Number should be formatted, e.g.5,000,000", 
                           value = prettyNum(input$formatNumber1, big.mark=",", scientific=FALSE))
        updateTextInput(session, "formatNumber2", "Number should be formatted, e.g.5,000,000",
                           value = prettyNum(input$formatNumber2, big.mark=",", scientific=FALSE))
      })
    }
  )
}

答案 1 :(得分:1)

shinyWidgets软件包具有一个很棒的新功能(自0.5.4版本起添加,也是免责声明,我通过拉取请求将其添加),autonumericInput将使您能够做到这一点。它基于javascript库自动数字。该功能有很多选项,但是文档内容丰富,对于简单用途,大多数可以忽略。

您要尝试执行的操作可以完成以下操作:

library(shiny)
library(shinyWidgets)

ui <- fluidPage(
  h1("Autonumeric Input Example"),
  shinyWidgets::autonumericInput(
    inputId = "num", 
    label = "Enter a large number:", 
    value = 1000000, 
    currencySymbolPlacement = "p",
    decimalPlaces = 2,
    digitGroupSeparator = ",",
    decimalCharacter = "."
  ),
  verbatimTextOutput("res1")
)

server <- function(input, output) {
  output$res1 <- renderText(input$num)
}

shinyApp(ui = ui, server = server)

这特别好,因为它提供了按需输入格式,以便用户可以轻松地知道输入的数字有多大。我从经验中知道,尝试将数字放大是很痛苦的将数字放入基础闪亮的numericInput中,尝试在一个小方框中对数字进行计数,然后找出有多少个零。此功能的目的是使格式化数字输入变得更加容易。

希望这很有用!

答案 2 :(得分:0)

这是我发现的唯一方法,但是,如果您太慢或在添加逗号后添加数字,则该数字将无法正确显示(例如,如果您在数字上添加0,则3,000变为3,0,000。字符串的结尾)。为了解决这个问题,我更改了updateTextInput()函数,如下所示:

updateTextInput(
  session, 
  "formatNumber1",
  "Number should be formatted, e.g.5,000,000", 
  value = prettyNum(
     gsub(",", "", input$formatNumber1),
     big.mark=",", scientific=FALSE
  )
)

实际上,每次修改输入时,都会使用gsub()函数将输入重置为数字,否则prettyNum()函数仅使用逗号后的数字,而忽略最后一个逗号左侧的所有数字。

如果您有多个输入要重新格式化,请按如下所示创建函数(注意:我还添加了req(input[[x]]),以避免在空白输入时出现NA

updatetoprettynb <- function(x) {
  req(input[[x]])

  updateTextInput(
    session,
    x,
    value = prettyNum(
      gsub(",", "", input[[x]]),
      big.mark = ",",
      scientific = FALSE
  )
)

}

您仍然必须以类似的方式使用该函数,但不要忘记使用“”:

observe({
 updatetoprettynb("formatNumber1")
})