DT表格在shiny中未显示。

4
我有一个闪亮的应用程序,可以通过一个简单的.bat文件开启,在后台执行R和脚本run.r。该应用程序广泛使用包DT来呈现所有表格。我的问题是,如果我从Rstudio运行应用程序,则显示所有表格,但如果我使用.bat文件执行应用程序,则它根本不显示表格。我已经尝试了4次,这是第一次出现这种情况,我不知道问题出在哪里。我拥有CRAN可用的最新版本的DT包。
因此,我的server.r如下:
server <- function(input, output,session) {
  observeEvent(input$run,{

TablasVaR <- function(mat,DT = T){
      mat_tbl <- data.frame(Activos = rownames(mat),Porcentaje = mat[,"Porcentaje"],
                            VaR = mat[,"Nivel"])

      tabla <- datatable(mat_tbl, escape = T,rownames = FALSE, 
                         selection = list(target = 'row'),
                         options = list(dom = 'tip', paging = TRUE))%>%
        formatStyle(1:ncol(mat_tbl),fontSize = '100%')%>%
        formatCurrency(3,digits = 0)%>%
        formatPercentage(2,digits = 1)
      if(DT){
        return(tabla)
      } else{
        return(mat_tbl)
      }

    }

    matr <- data.frame(Porcentaje=rnorm(19),Nivel = rnorm(19))



  output$table <- renderDataTable({TablasVaR(matr)})
  })
  session$onSessionEnded(function() {
    stopApp()
  })  
}

the ui.r is

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(),
    wellPanel(style = "background-color: #ffffff;",
              bsButton("run","run1",block=F, style="default"),
              fluidRow(column(4,align="center",offset = 4,
                              dataTableOutput("table"))))
  ))

run.r是什么:

librerias <- c("openxlsx","ggplot2","scales","rugarch","zoo","data.table","stringr",
               "DT","plotly","lubridate","knitr","gridExtra","grid","shinyBS",
               "rmarkdown","nloptr","shiny")
if(length(setdiff(librerias, rownames(installed.packages()))) > 0){
  install.packages(setdiff(librerias, rownames(installed.packages())))
}
invisible(sapply(librerias, require, character.only = TRUE))
CAMINO <<- "D:/Users/aandr/Documents/Ejemplo/"
runApp(CAMINO, launch.browser=TRUE)

而 .bat 文件包含以下内容:

"C:\Program Files\R\R-3.5.1\bin\R.exe" CMD BATCH "run.r"

如果我从run.r中运行shiny应用程序,则会显示DT,但如果我从.bat文件运行它,则不会显示。 要使其运行,您需要将server.r、ui.r、run.r和.bat文件保存在同一个文件夹中。


如果没有可重现的东西,我们可能无法提供帮助。您能否在问题中添加一个代表性但较小的漂亮应用程序? - r2evans
@r2evans 刚刚添加了一个最小化的例子,导致我的电脑出现了问题。 - Alejandro Andrade
不错的最小工作示例,顺便说一句,它起了很大的作用。 - r2evans
1个回答

7

如果您阅读RStudio的在Shiny中使用DT页面,您可能没有注意到:

请注意,在 DT 中, DTOutput() dataTableOutput() 的别名,而 renderDT() renderDataTable() 的别名。建议您使用 DTOutput() renderDT() ,以避免与 shiny 中同名函数( shiny :: dataTableOutput() shiny :: renderDataTable() )可能发生的冲突。

冲突,这是您的问题。要确认一下,如果您看到以下内容:

find("dataTableOutput")
# [1] "package:DT"    "package:shiny"
find("renderDataTable")
# [1] "package:DT"    "package:shiny"

如果出现函数名称冲突,很可能是原因。请尝试用DT::dataTableOutput(...)DTOutput(...)替换dataTableOutput(...);并用DT::renderDataTable(...)renderDT(...)替换renderDataTable(...)。请注意保留HTML标签。

我以前没有见过DTOutput函数,但这正是问题所在,很烦人的是它在Rstudio上工作,但在R控制台上却不行。谢谢。 - Alejandro Andrade
这是一个相当糟糕的碰撞,尤其是当两个软件包都由同一组编写时。(tidyverse 也受到了这种影响。)我的偏好是具体指定 DT::renderDataTable,但别名也可以正常工作。很高兴能帮忙。(我一直在考虑使用 loadNamespace(...) 而不是 library,部分原因是为了强制自己使用 DT::。虽然我还没有找到它的破解点,但我肯定错过了什么。顺便说一下:在您的代码中使用 require 是不正确的:如果您不检查其返回值,则使用 library。参考:https://dev59.com/qG035IYBdhLWcg3wJcjT#51263513) - r2evans
1
我以前在之前的闪亮应用程序中使用DT::,但我不知道为什么在这个应用程序中更改了它,但再也不会这样做了。感谢require的注释。 - Alejandro Andrade
随着最近冲突越来越普遍,我非常喜欢 Python 的导入机制:import pkgname 强制要求使用 pkgname.func,这很明确易懂;import pkgname as pkg 允许进行快捷方式操作,既清晰又方便,希望 R 也有这种机制。 - r2evans
像一个真正的警告(而不是它当前显示的消息)这样更基本的东西会起作用。 - Alejandro Andrade
现在有很多冲突和许多脚本使用 options(warn=2)(错误而不是警告),这将是一种不兼容的行为变更。虽然我不反对,但 R 的命名空间管理方法可能需要进行一些调整。 - r2evans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接