【问题标题】:R Shiny and Shiny Files error in reactive expression反应式表达式中的 R Shiny 和 Shiny Files 错误
【发布时间】:2016-08-12 15:22:20
【问题描述】:

我一直在开发一个 R Shiny 应用程序,该应用程序使用两个文件夹中的内容来执行一些分析,但我很难使用 ShinyFiles 应用程序处理反应式表达式。

这是我遇到问题的部分:

shinyServer(function(input, output, session) {
volumes = getVolumes()

folderInput1<- reactive({
    shinyDirChoose(input, 'directory', roots= volumes, session=session, restrictions=system.file(package='base'))
    return(parseDirPath(volumes, input$directory))})
folderInput2<- reactive ({
        shinyDirChoose(input, 'directory2', roots=volumes, session=session, restrictions=system.file(package='base'))
        return(parseDirPath(volumes, input$directory2 ))})

output$directorypath = renderPrint({folderInput1()})
output$directorypath2 = renderPrint({folderInput2()}) 

files1 <- list.files(path=folderInput1(), pattern="*.csv", full.names=T)
nFiles1 = length(files1)
files2 <- list.files(path= folderInput2(), pattern="*.csv", full.names=T)
nFiles2 = length(files2)

这是我收到的错误消息: .getReactiveEnvironment()$currentContext() 中的错误:如果没有活动的反应上下文,则不允许操作。 (你试图做一些只能在反应式表达式或观察者内部完成的事情。)

当我只使用一次来自用户的输入文件夹时,我没有收到此错误。

这个问题已经解决了。谢谢!

现在,我在数据结构(如数据框)中使用反应式表达式时遇到了问题。例如:

folder_df = data.frame(matrix(0,ncol = 4, nrow = nFiles1())) 

我收到以下错误消息: 矩阵错误(0,ncol = 4,nrow = nFiles1()):非数字矩阵范围

【问题讨论】:

  • 确切的问题是什么?
  • 我需要使用相同的输入文件夹来执行不同的分析。这是错误消息:.getReactiveEnvironment()$currentContext() 中的错误:如果没有活动的反应上下文,则不允许操作。 (您试图做一些只能在反应式表达式或观察者内部完成的事情。)

标签: r input shiny directory reactive-programming


【解决方案1】:

您收到此错误是因为您尝试访问反应值 folderInput()folderInput2() 并且您不在响应式上下文中执行此操作,例如 observereactiverender* 函数。

解决办法是把这部分代码封装起来(也就是files2

files1 <- list.files(path=folderInput1(), pattern="*.csv", full.names=T)
nFiles1 = length(files1)

进入reactive 函数。然后,您可以通过files1()nfiles1 在响应式上下文中访问files1nFiles1

  files1 <- reactive({
    list.files(path = folderInput1(), pattern = "*.csv", full.names = T)
  })

  nFiles1 <- reactive({ length(files1() ) })

完整示例:

library(shiny)
library(shinyFiles)

server <- shinyServer(function(input, output, session) {
  volumes = getVolumes()

  folderInput1 <- reactive({
    shinyDirChoose(input, 'directory', roots = volumes, session = session, 
                   restrictions = system.file(package = 'base'))
    return(parseDirPath(volumes, input$directory))
  })

  folderInput2 <- reactive ({
    shinyDirChoose(input, 'directory2', roots = volumes, session = session, 
                   restrictions = system.file(package = 'base'))
    return(parseDirPath(volumes, input$directory2))
  })

  output$directorypath = renderPrint({  folderInput1()  })
  output$directorypath2 = renderPrint({  folderInput2()  }) 


  files1 <- reactive({
    list.files(path = folderInput1(), pattern = "*.csv", full.names = T)
  })

  nFiles1 <- reactive({ length(files1() ) })


  files2 <- reactive({
    list.files(path = folderInput2(), pattern = "*.csv", full.names = T)
  })

  nfiles2 <- reactive({ length(files2() )})

})

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      tags$hr(),
      shinyDirButton('directory', 'Folder select', 'Please select a folder'),
      shinyDirButton('directory2', 'Folder select', 'Please select a folder')
    ),
    mainPanel(
      verbatimTextOutput('directorypath'),
      verbatimTextOutput('directorypath2')

    )
  )
)

shinyApp(ui, server)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-06
    • 2015-08-14
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    相关资源
    最近更新 更多