如何在Shiny Modules中使用shinyFiles包 - 命名空间问题?

时间:2016-08-03 14:57:16

标签: r namespaces shiny

我在使用" shinyFilesButton()"时遇到了问题。和" shinyFilesChoose()" R闪亮模块中的功能。

我认为我的问题与命名空间函数(" ns()")有关,它们在模块中有效地创建了新的,唯一的ID。

我在哪里将ns()调用放在shinyFiles函数中?如何在服务器端处理此问题?

我嘲笑了一个例子,代码如下所示。该应用程序只选择一个文件,并告诉您有关所选内容的信息。 请注意,目前没有任何ns()调用与任何shinyFiles函数一起使用。 (我已经尝试在ns()中包装shinyFilesButton()的id,但是它与shinyFileChoose不匹配。)

目前,下面的这个应用程序将显示我的文件,但只显示在根目录中。我无法深入研究其他目录。此外,选择按钮将突出显示,但使用时不会发生任何事情。

修改:我根据评论中的建议尝试使用命名空间来更新代码。我在shinyFilesButton()调用(ui端)中使用ns()函数,而在服务器端没有任何内容。

现在,在使用文件选择器时,我无法看到任何文件。

任何帮助?

以下是app.r文件的代码:

#App.R
#Demonstrate issues with ShinyFiles and namesspaces in modules

library(shiny)
library(shinyFiles)

source("shinyFiles_module.R")

server <- function(input, output, session) {
  #module Way
  callModule(sample,
             id="testid",
             root_dirs=c(root_on_mac="/Users/Ryan/Desktop/"))
}

ui <- fluidPage(
  tagList(
    h2("Module Way"),
    sample_UI(id = "testid",
              label = "shiny file test")
  )
)

shinyApp(ui = ui, server = server)

对于模块:

#Sample shinyFiles Module
#trying to get File path using ShinyFiles within a Module

library(shiny)
library(shinyFiles)

#Settings UI function:
# Module UI function
sample_UI <- function(id, label = "Shiny file test") {
  # Create a namespace function using the provided id
  ns <- NS(id)

  #begin UI (wrap all input/ouput in ns() call)
  tagList(
    strong("Selected Location: "), verbatimTextOutput(ns("file_path")),
    shinyFilesButton(
      id=ns("get_file_path"), 
      label="Click Here to Select", 
      title="Select a file",
      multiple= FALSE,
      buttonType = "default", 
      class = NULL)
  )
}

# Module server function
sample <- function(input, 
                   output, 
                   session,
                   root_dirs,
                   id_value) {

  shinyFileChoose(input, id="get_file_path", roots=root_dirs, session=session)

  output$file_path <- renderPrint({
    parseFilePaths(roots=root_dirs, input$get_file_path)
  })
}

2 个答案:

答案 0 :(得分:1)

将模块更改为此模块,您的程序可以正常运行:

library(shiny)
library(shinyFiles)

#Settings UI function:
# Module UI function
sample_UI <- function(id, label = "Shiny file test") {
  # Create a namespace function using the provided id
  ns <- NS(id)

  #begin UI (wrap all input/ouput in ns() call)
  tagList(
    strong("Selected Location: "), verbatimTextOutput(ns("file_path")),
    shinyFilesButton(
      id=ns("get_file_path"), 
      label="Click Here to Select", 
      title="Select a file",
      multiple= FALSE,
      buttonType = "default", 
      class = NULL)
  )
}

# Module server function
sample <- function(input, 
                   output, 
                   session,
                   root_dirs) {
  ns <- session$ns
  shinyFileChoose(input, id=ns("get_file_path"), roots=root_dirs, session=session)

  output$file_path <- renderPrint({
    parseFilePaths(roots=root_dirs, input$get_file_path)
  })
}

答案 1 :(得分:0)

我遇到了同样的问题,并且按照卡尔的建议解决了这个问题:

  • 在ui中使用ns()
  • 删除服务器中的ns()

我正在使用R3.6.1,它可以工作。在R3.4中,导航到子文件夹时存在问题。

library(shiny)
library(shinyFiles)

#Settings UI function:
# Module UI function
sample_UI <- function(id, label = "Shiny file test") {
  # Create a namespace function using the provided id
  ns <- NS(id)

  #begin UI (wrap all input/ouput in ns() call)
  tagList(
    strong("Selected Location: "), verbatimTextOutput(ns("file_path")),
    shinyFilesButton(
      id=ns("get_file_path"), 
      label="Click Here to Select", 
      title="Select a file",
      multiple= FALSE,
      buttonType = "default", 
      class = NULL)
  )
}

# Module server function
sample <- function(input, 
                   output, 
                   session,
                   root_dirs,
                   id_value) {

  shinyFileChoose(input, id="get_file_path", roots=root_dirs, session=session)

  output$file_path <- renderPrint({
    parseFilePaths(roots=root_dirs, input$get_file_path)
  })
}