我有一个闪亮的应用程序,可以使用sprintf转换数字
这最初是大型应用程序的一部分,但为了进行故障排除,我将其简化为仅引起问题的功能。我还指定了要使用的程序包,以防发生程序包冲突/掩码等情况。
它在本地运行,但是当我将其上传到Shiny Apps服务器时,它会损坏。
```
library(base)
library(shiny)
#Function to covert between sss.ss and mm:ss.ss format
mmss_format <- function(x, ...) {
sec <- x%%60
min <- x%/%60
sec <- base::sprintf("%05.2#f", sec)
ifelse(min == 0, base::paste(sec),
base::paste(min, sec, sep = ":"))
}
# Define UI for application that draws a histogram
ui <- fluidPage(
# Application title
titlePanel("Test app"),
# Show input and output
mainPanel(textInput(inputId = "TestIn1",
label = "To:",
value = "100.45",
width = "100px"),
br(),
textOutput(outputId = "TestOut1")
))
# Define server
server <- function(input, output) {
output$TestOut1 <- reactive({mmss_format(as.numeric(input$TestIn1))
})
}
# Run the application
shinyApp(ui = ui, server = server)
```
当我输入数字(上面的示例为100.45)时,在本地运行mmss_function返回1:40.45作为字符串(表示一分钟,即40.45秒)。那就是我想要的。
尽管我得到了1:%05.2#f,但仍在闪亮的服务器上运行。这是我的问题。 https://gpilgrim.shinyapps.io/testapp2/
这告诉我sprintf函数出了点问题,它只是在打印该字符串,而不是根据sprintf文档解释“%05.2#f”。
答案 0 :(得分:0)
我编写了另一个函数,该函数执行相同的操作,但使用格式而不是sprintf。它可以在服务器上运行,但是我仍然很好奇为什么sprintf不能。
mmss_formatF <- function(x, ...) {
sec <- x%%60
min <- x%/%60
sec <- format(sec,trim = FALSE, nsmall = 2)
ifelse(min == 0, base::paste(sec),
base::paste(min, sec, sep = ":"))
}
该应用程序已更新为显示两个输出: https://gpilgrim.shinyapps.io/testapp2/
答案 1 :(得分:0)
哇,您的R版本是?这对我适用于R 3.4,但不适用于R 3.2或3.5。
# R 3.4.3
R.version.string
## [1] "R version 3.4.3 (2017-11-30)"
sprintf("%05.2#f", 123)
## [1] "123.00"
# R 3.2.3
R.version.string
## [1] "R version 3.2.3 (2015-12-10)"
sprintf("%05.2#f", 123)
## [1] "%05.2#f"
# R 3.5.0
R.version.string
## [1] "R version 3.5.0 (2018-04-23)"
sprintf("%05.2#f", 123)
## [1] "%05.2#f"
我浏览了https://cran.r-project.org/doc/manuals/r-release/NEWS.html,但没有发现任何相关内容。
我认为问题在于哈希的位置。尝试将其放在%
之后,例如:
sprintf("%#05.0f", 123)
## [1] "0123."
或排除它,因为它会加上小数,但是无论如何您已经用.2f
指定了2个小数位。