sprintf在本地运行,但在Shinyapps.io服务器上中断

时间:2019-01-22 20:23:54

标签: r shiny

我有一个闪亮的应用程序,可以使用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”。

2 个答案:

答案 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个小数位。