无法格式化计算的滑块最小值和最大值以减少小数位

Unable to format calculated slider min and max values to reduce decimal places

我找不到任何关于如何从动态数据格式化滑块值的文档。我试图将“dollar”和“dollar_format”包裹在滑块范围值周围,但它让我大吃一惊。

ui <- fluidPage(
  headerPanel(title = "Test"),
  sidebarLayout(
    sidebarPanel(
      fileInput("NewData", "Upload File", multiple = FALSE, accept = ".xlsx") 

    ),
    
    mainPanel(
      
      tabsetPanel( type = "tabs", #Open panel
                   tabPanel("Distributions 1",plotOutput("hist1.plot")
                            ,uiOutput("updaterange")
                            )
                   
      ),
      tabsetPanel( type = "tabs", #Open panel
                   tabPanel("Distributions 2",plotOutput("hist2.plot")
                            #,uiOutput("update_mod_hist_range")
                            )
      )
      
    ) # close mainPanel
  ) # close sidebarLayout
) # close fluidPage


server <- function(input,output){ 
  
  ev = reactiveValues()
  
  
  observeEvent(input$NewData,{
    if(is.null(input$NewData))
      return(NULL)
    
    ev$sim.data <- read_excel(input$NewData$datapath)
    req(ev$sim.data)
    
    amount = c(sapply(ev$sim.data$amt,function(x){runif(1000,1,x)}))
    
    cat = (rep(ev$sim.data$cat, each = 1000))
    
    hist.data = data.frame(amount,cat)
    names(hist.data) = c("amount","cat")
    hist.data$cat = factor(hist.data$cat, levels = c("a","b","c"))
    
    low = mean(hist.data$amount)-sd(hist.data$amount)
    high = mean(hist.data$amount) + sd(hist.data$amount)
    
    ev$low = low
    ev$high = high
    ev$hist.data <- hist.data
    
    output$updaterange = renderUI({

      sliderInput("update_mod_hist_range","Update this Histogram",
                  min = min(ev$hist.data$amount),
                  max = max(ev$hist.data$amount),
                  value = c(ev$low,ev$high)
      )
    })
    
    
    pricedata = ddply(hist.data, c("cat"), plyr::summarize, avg = mean(amount), minus.stdev = mean(amount)-sd(amount),
                      plus.stdev = mean(amount) + sd(amount))
    pricedata = pricedata[order(pricedata$avg),]
    
    output$hist1.plot = renderPlot({
      
      ggplot(subset(hist.data, cat!="" ), 
             aes(x=amount, fill = cat))+
        geom_histogram(color="white", alpha = .8, position = 'identity', binwidth = 5)+
        theme_test()+
        geom_vline(aes(xintercept = avg), data = pricedata, color = "black", size = 1)+
        
        geom_vline(aes(xintercept = minus.stdev), data = pricedata, color = "black", size = .75, linetype = "dotted")+
        
        geom_vline(aes(xintercept = plus.stdev), data = pricedata, color = "black", size = .75, linetype = "dotted")+
        
        facet_grid(cat ~., scales = "free")+
        scale_y_continuous(expand = c(0,0),name = "Count")+
        scale_x_continuous(labels = scales::dollar, name="\nAmount", limits = c(0,100))
      
    }) #close renderPlot
    
  })

  observeEvent(input$update_mod_hist_range,{
    if(is.null(input$update_mod_hist_range)) return(NULL)
    
    mod.amount = runif(1000,input$update_mod_hist_range[1],input$update_mod_hist_range[2])
    
    #mod.amount = runif(1000,ev$low,ev$high)
    
    
    cat = rep("x",1000)
    mod.hist.data = data.frame(mod.amount,cat)
    names(mod.hist.data) = c("amount","cat")
    
    #mod.hist.data$cat = factor(mod.hist.data$cat, levels = c("a","b","c"))
    pricedata2 = ddply(mod.hist.data, c("cat"), plyr::summarize, avg = mean(amount), minus.stdev = mean(amount)-sd(amount),
                       plus.stdev = mean(amount) + sd(amount))
    pricedata2 = pricedata2[order(pricedata2$avg),]
    output$hist2.plot = renderPlot({ # open renderPlot
      
      ggplot(mod.hist.data, aes(x=amount))+
        geom_histogram(color="white", alpha = .8, position = 'identity', binwidth = 5)+
        theme_test()+
        geom_vline(aes(xintercept = avg), data = pricedata2, color = "black", size = 1)+
        
        geom_vline(aes(xintercept = minus.stdev), data = pricedata2, color = "black", size = .75, linetype = "dotted")+
        
        geom_vline(aes(xintercept = plus.stdev), data = pricedata2, color = "black", size = .75, linetype = "dotted")+
        
        #facet_grid(cat ~., scales = "free")+
        scale_y_continuous(expand = c(0,0),name = "Count")+
        scale_x_continuous(labels = scales::dollar, name="\nAmount", limits = c(0,100))
      
    }) #close renderPlot
  
  
})
 
     
} # close shinyServer

shinyApp(ui = ui, server = server)

输入文件是 excel(无法附加文件):

a1 = amt
a2 = 50
a3 = 60
a4 = 70
b1 = cat
b2 = a
b3 = b
b4 = c

您可以在下图中看到最小值和最大值有很多尾随小数。

发生这种情况是因为您将滑块的最小值和最大值设置为小数点后有很多数字的值。您可以通过首先舍入滑块最小值和最大值的值来解决此问题,例如:

sliderInput("update_mod_hist_range","Update this Histogram",
    min = floor(min(ev$hist.data$amount)),
    max = ceiling(max(ev$hist.data$amount)),
    value = c(ev$low,ev$high)
)

floor 向下舍入,ceiling 向上舍入。