下面是我的noUiSlider的样子:

enter image description here

我想将刻度标签的格式设置为:1000-1K、900000-900K、5000000-5M等,即用适当的SI符号缩写数字.

library(shiny)
library(shinyWidgets)

ui <- fluidPage(
  
  tags$br(),
  
  noUiSliderInput(
    inputId = "noui", 
    label = "Slider vertical:",
    value =  50,
    orientation = "vertical",
    range = list("min" = list(0),
                 "25%" = list(1000, 500),
                 "50%" = list(10000, 50000),
                 "75%" = list(4000000, 500000),
                 "max" = list(10000000)),
    pips = list(
      mode = "values",
      values = list(0, 500, 1000, 900000, 5000000, 10000000),
      density = 4
    ),
    format = wNumbFormat(decimals = 0),
    width = "300px", height = "300px"
  ),
  verbatimTextOutput(outputId = "res")
  
)

server <- function(input, output, session) {
  
  output$res <- renderPrint(input$noui)
  
}

shinyApp(ui, server)

推荐答案

我们需要使用JavaScript设置pips选项,以便能够将函数传递给format子选项:

library(shiny)
library(shinyWidgets)
library(shinyjs)

abbreviateNumber <- '
const SI_SYMBOLS = ["", "k", "M", "G", "T", "P", "E"];

const abbreviateNumber = (number, minDigits, maxDigits) => {
    if (number === 0) return number;

    // determines SI symbol
    const tier = Math.floor(Math.log10(Math.abs(number)) / 3);

    // get suffix and determine scale
    const suffix = SI_SYMBOLS[tier];
    const scale = 10 ** (tier * 3);

    // scale the number
    const scaled = number / scale;

    // format number and add suffix
    return scaled.toLocaleString(undefined, {
        minimumFractionDigits: minDigits,
        maximumFractionDigits: maxDigits,
    }) + suffix;
};' # https://stackoverflow.com/a/65324090/1100107

js <- paste(
  "var slider = document.getElementById('noui').noUiSlider;",
  "slider.pips({",
  "  mode: 'values',",
  "  values: [0, 500, 1000, 900000, 5000000, 10000000],",
  "  density: 4,", 
  "  format: {", 
  "    to: function(x) {return abbreviateNumber(x);}",
  "  }",
  "});",
  sep = "\n"
)


ui <- fluidPage(
  
  useShinyjs(),
  
  tags$head(
    tags$script(HTML(abbreviateNumber))
  ),
  
  tags$br(),
  
  noUiSliderInput(
    inputId = "noui", 
    label = "Slider vertical:",
    value =  50,
    orientation = "vertical",
    range = list("min" = list(0),
                 "25%" = list(1000, 500),
                 "50%" = list(10000, 50000),
                 "75%" = list(4000000, 500000),
                 "max" = list(10000000)),
    format = wNumbFormat(decimals = 0),
    width = "300px", height = "300px"
  ),
  
  verbatimTextOutput(outputId = "res")
  
)

server <- function(input, output, session) {
  
  observeEvent(input$noui, {
    runjs(js)
  }, once = TRUE)
  
  output$res <- renderPrint(input$noui)
  
}

shinyApp(ui, server)

enter image description here

Javascript相关问答推荐

如何在加载的元数据上使用juserc和await中获得同步负载?

从连接字符串创建客户端时,NodeJS连接到CosmosDB失败

如何修复循环HTML元素附加函数中的问题?

我在这个黑暗模式按钮上做错了什么?

每次子路由重定向都会调用父加载器函数

JQuery. show()工作,但. hide()不工作

InDesign—创建一个独立的窗口,在文档中进行更正时保持打开状态

使搜索栏更改语言

分层树视图

用于编辑CSS样式的Java脚本

我可以使用空手道用户界面来获取网页的当前滚动位置吗?

TypeError:无法分解';React2.useContext(...)';的属性';basename';,因为它为空

如何在Node.js中排除导出的JS文件

MarkLogic-earch.suggest不返回任何值

TypeError:无法读取未定义的属性(正在读取';宽度';)

对具有相似属性的对象数组进行分组,并使用串连的值获得结果

Pevent触发material 用户界面数据网格中的自动保存

有没有办法通过使用不同数组中的值进行排序

react 路由DOM有条件地呈现元素

如果我的列有条件,我如何呈现图标?