天道酬勤,学无止境

Interactive file input and reactive reading in shinyapp

问题

我想制作一个闪亮的应用程序,它集成了选择文件(在选定的文件夹中)的功能(如在 Shiny 应用程序(R)中的交互式目录输入中),然后通过检测其中的更改来反应性地读取它,如 https ://gist.github.com/wch/9652222。

但是,我无法使 reactiveFileReader 函数与反应式文件名(文件夹)一起使用。 它似乎只适用于一个预先确定的文件名。

在这个应用程序中,文件预计会在选择任何文件夹(按钮)后自动选择,前提是它在内部并且具有与子文件夹相同的名称和扩展名 .csv
例如,如果您选择 /home/name/folder,则所选文件应为 /home/name/folder/folder.csv
下面是没有预期功能的代码。 它显示了一个示例文件。

server<- function(input, output, session) { 
  shinyDirChoose(input, 'dir', roots = c(home = path1) )
  reacdir <- reactive(input$dir)
  output$dirtext <- renderPrint(c(path(),current() ) )
  path1<-"~"
  path <- reactive({
    home <- normalizePath(path1)
    file.path(home, paste(unlist(reacdir()$path[-1]), collapse = .Platform$file.sep))
  })

  current<-reactive({
    a<-sub('.*\\/', '', path() )  
    b<-paste("current subdir:",a)
  })

#  logfilename<- reactive({filename<-paste0(path(),"/",sub('.*\\/', '', path() ),".csv")})
   logfilename <- paste0('logfile',
                         floor(runif(1, 1e+05, 1e+06 - 1)),".txt")
  #    

  logwriter <- observe({
    invalidateLater(1000, session)
    cat(as.character(Sys.time()), '\n', file = logfilename,
        append = TRUE)
  })

  fileReaderData <- reactiveFileReader(500, session,
                                       logfilename, readLines)
 # when using logfilename(): You tried to do something that can only be done from inside a reactive expression or observer.

  # Also not working: fileReaderData <- reactive({file<-reactiveFileReader(500, session,
  #                                       logfilename(), readLines) })

  output$fileReaderText <- renderText({
    text <- fileReaderData()
    length(text) <- 14
    text[is.na(text)] <- ""
    paste(text, collapse = '\n')
  })
}
ui<-fluidPage(
  titlePanel("interactive selection of file and reactive reading"),
  fluidRow(
    column(12,
           shinyDirButton("dir", "1. Choose directory", "Upload")
           ,br(),br(),
            p("This app has a log file which is appended to",
             "every second.")
    )
  ),
  fluidRow(
    column(6, wellPanel(
      verbatimTextOutput("fileReaderText")
    ))
  )
)

shinyApp(ui, server)   

回答1
library(shiny)
library(shinyFiles)
path1<-"~"
server<- function(input, output, session) { 
  shinyDirChoose(input, 'dir', roots = c(home = path1) )
  reacdir <- reactive(input$dir)
  output$dirtext <- renderPrint(c(path(),current() ) )

  path <- reactive({
    home <- normalizePath(path1)
    file.path(home, paste(unlist(reacdir()$path[-1]), collapse = .Platform$file.sep))
  })

  current<-reactive({
    a<-sub('.*\\/', '', path() )  
    b<-paste("current subdir:",a)
  })
  reac<-reactiveValues()
    observe({
        if(file.exists(paste0(path(),"/",sub('.*\\/', '', path() ),".csv")) ){
      fileReaderData<-reactiveFileReader(1000, session, paste0(path(),"/",sub('.*\\/', '', path() ),".csv"), read.csv, stringsAsFactors=FALSE)
      reac$df<-fileReaderData()
      output$fileReaderText <- renderText({
        text <- reac$df
        length(text) <- 14
        text[is.na(text)] <- ""
        paste(text, collapse = '\n')
    })
    }
    else{"index file does not exist, create with button 2."}
    }
  ) 
}
ui<-fluidPage(
  titlePanel("interactive selection of file and reactive reading"),
  fluidRow(
    column(12,
           shinyDirButton("dir", "1. Choose directory", "Upload")
           ,br(),br(),
           p("shinyapp")
    )
  ),
  fluidRow(
    column(6, wellPanel(
      verbatimTextOutput("fileReaderText")
    ))
  )
)

shinyApp(ui, server)  
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Interactive file input and reactive reading in shinyapp
    I would like to make a shinyapp that integrates the functionality of choosing a file (in a selected folder), (like in Interactive directory input in Shiny app (R)), and then reading it reactively by detecting changes in it, as in https://gist.github.com/wch/9652222. However, I could not make the reactiveFileReader function work with a reactive filename (folder). It seems to work only with one pre-determined filename. In this app, the file is expected to be chosen automatically after chosing any folder (button), provided that it is inside and has the same name of the subfolder and the extension
  • 在Shiny应用程序(R)中进行交互式目录输入(Interactive directory input in Shiny app (R))
    问题 我正在构建一个闪亮的应用程序,它要求用户在本地计算机上选择一个文件夹,其中包含要由该应用程序处理的文件。 我正在使用此处提出的解决方案。 这在本地计算机上可以正常工作,但是如果将应用程序部署到Shinyapps服务器上则无法正常工作。 该解决方案的作者确认,该解决方案仅设计用于本地的Shiny应用程序,因为它进行OS Shell调用以显示目录对话框。 我想知道是否存在用于目录对话框的其他解决方案,该解决方案将在已部署的Shiny应用程序上正常工作(我正在部署到Shinyapps.io)。 编辑:请注意,由于以下两个原因,我无法使用fileInput接口: 该应用程序的用户不是技术人员,他们不知道该应用程序使用该文件夹中的哪些文件。 所选文件夹可能包含所需文件所在的其他文件夹,因此即使fileInput接口启用了multiple选项,也无法一次选择所有文件。 文件夹/文件结构不是我可以更改的东西,它是从医疗设备按原样下载的,因此,我唯一可以期望用户指定的是父文件夹,其余应在R代码中完成。 回答1 这是一个基于使用“ webkitdirectory”属性的工作示例。 目前,Chrome,Opera和Safari(移动和台式机)支持该属性,9月发布的Firefox 49应该支持该属性。 有关此的更多信息。 它也可与子目录一起使用。 它需要在ui.R中使用tags关键字。
  • 不使用服务帐户从 R 脚本读取 Googlesheet 的远程服务器身份验证?(Remote server authentication to read Googlesheets from R script not using service accounts?)
    问题 我正在 R 中自动化一个流程,该流程以某种方式提取、推送、分析和存储数据,总而言之,在 Googlesheets、Postgresql 和 salesforce 之间处理数据。 到目前为止,我已经在我的系统中运行了它,但我需要在 aws 上从我的远程登录 ssh 服务器运行脚本。 问题是,我在 R 中使用“googlesheets”包来验证和阅读谷歌表格,但这需要一个交互式环境来注册/设置。 我已经阅读了关于这个问题的其他答案,但他们都建议开设一个谷歌服务帐户。 但是,我不想这样做,因为我所需要的只是阅读那些本身是免费的 Google 表格。 我现在没有 GCP、谷歌计算、bigquery 或任何这些,我现在当然无法获得任何报酬。 有没有办法从非交互式环境(linux 终端远程登录界面)读取谷歌表? 我愿意尝试其他库或您可能拥有的任何其他黑客。 任何人? 回答1 我在类似的事情上挣扎了好几个小时,所以即使这是一个老问题,我认为其他人可能会发现这个解决方案很有用。 我的问题是以非交互式方式通过 Shiny App 读取和修改谷歌表的身份验证。 无论我是否将其保存在应用程序中嵌入的缓存文件夹中,该应用程序总是会触发舞蹈身份验证过程。 我使用以下指南和问题来指导自己完成整个过程: https://cran.r-project.org/web/packages/gargle
  • Shiny Plot 中的反应环境错误(Error in reactive environment in Shiny Plot)
    问题
  • Error in reactive environment in Shiny Plot
    This is my first question, so please be patient with me. I am trying to pass a dataset into an interactive shiny plot. Here is the gist of what I have on the server side. # Load all necessary packages load <- c( "shiny", "shinythemes", "ggplot2", "BH", "DT", "rCharts", "markdown", "data.table", "dplyr" ) loaded <- lapply(load, function(x) { if (!require(x, character.only = T)) { install.packages(x) require(x, character.only = T) } }) # Define UI for application that draws a histogram ui <- navbarPage( "Testkit", # Tabpanel for Upload and Overview ---- tabPanel( "Upload & Overview", # Sidebar
  • 使用downloadHandler时如何修复“找不到文件”?(How to fix 'File not found' when using the downloadHandler?)
    问题 我刚刚开始玩弄闪亮的东西,并制作了一个简单的应用程序,它读取一个 CSV 文件并用标记替换一列的行。 我希望用户能够将标记化数据下载为 CSV 文件。 为此,我使用了downloadHandler()函数。 我一直在查看此功能的文档以及此处的类似问题,但无法找到解决方案。 我尝试按照其他类似问题中的建议在外部运行该应用程序。 应用程序 # Only run examples in interactive R sessions if (interactive()) { ui <- fluidPage( sidebarLayout( sidebarPanel( fileInput("file1", "Choose CSV File", accept = c( "text/csv", "text/comma-separated-values,text/plain", ".csv") ), tags$hr(), checkboxInput("header", "Header", TRUE), textInput(inputId = 'variable', label = 'Name of variable to pseudonymize', placeholder = 'e.g., ID_PA'), helpText("Case sensitive!")
  • 使用鼠标点击闪亮的交互式绘图(Interactive plotting in shiny using mouse clicks)
    问题 我正在做一个项目,我使用闪亮的服务器并将 R 连接到 mongodb 以从数据库中获取结果并动态显示它。 但是,我面临以下问题。 我最初从 db 获得结果并绘制一个图。 完成此图后,我希望用户在该图上进行两次鼠标单击,根据该图应将两个值作为 xlim 并绘制前一个图的缩放版本。 但是,我无法成功完成。 这是我写的代码。 用户界面 library(shiny) shinyUI(fluidPage( titlePanel("LOAD AND PERFORMANCE DASHBOARD"), sidebarLayout( sidebarPanel( fluidRow( selectInput("select", label = h3("Select type of testing"), choices = list("Performance Testing"=1, "Capacity Testing"=2)), radioButtons("radio", label = h3("Select parameter to plot"), choices = list("Disk" = 1, "Flit" = 2,"CPU" = 3,"Egress" =4, "Memory" = 5)) )), mainPanel( plotOutput("plot",clickId="plot
  • 如何在 Shiny 中保存传单地图(How to save a leaflet map in Shiny)
    问题 继此问题之后,我希望将传单地图保存和下载为 png 或 jpeg 图像。 我有以下代码,但我不断收到错误消息。 ui <- fluidPage( leafletOutput("map"), downloadButton("dl") ) server <- function(input, output, session) { output$map <- renderLeaflet({ leaflet() %>% addTiles() }) output$dl <- downloadHandler( filename = "map.png", content = function(file) { mapshot(input[["map"]], file = file) } ) } shinyApp(ui = ui, server = server) 我尝试下载(通过单击按钮)时遇到的错误是 Warning: Error in system.file: 'package' must be of length 1 Stack trace (innermost first): 65: system.file 64: readLines 63: paste 62: yaml.load 61: yaml::yaml.load_file 60: getDependency 59
  • 在闪亮的应用程序中使用 ggvis 创建散点图(Creating a scatter plot using ggvis in a shiny app)
    问题 我正在尝试创建一个简单的应用程序,它执行以下操作: 导入一个 csv 文件作为反应式(这必须是反应式) 将csv的内容打印为一个tabPanel中的数据表在另一个 tabPanel 中使用 ggvis 创建交互式散点图 但是我无法创建绘图 - 应该出现绘图的 tabPanel 是空白的。 控制台中没有任何错误或警告消息。 不知道代码有什么问题。 这是代码: # Define UI for application ui <- fluidPage( # Application title titlePanel("App"), sidebarLayout( sidebarPanel( fileInput(inputId = "inputCrossTab" , label = "Select the input sheet" , multiple = FALSE , accept = c('.csv') ) ), # Show a table and plot mainPanel( tabsetPanel(id = "tabset" , type = 'pills' , tabPanel(title = "Table" , DT::dataTableOutput('table') ) , tabPanel(title = "Charts" ,ggvisOutput("plot") )
  • 使用 plotlyProxy 按名称删除跟踪(或在响应式上下文中访问输出模式)(Removing traces by name using plotlyProxy (or accessing output schema in reactive context))
    问题 我正在尝试使用plotlyProxy()功能(此处记录)来允许闪亮应用程序的用户以最小的延迟添加和删除跟踪。 添加跟踪证明相对简单,但我很难弄清楚如何按名称删除跟踪(我只看到按跟踪编号删除的记录示例) 。 有没有办法使用plotlyProxy()按名称删除痕迹? 如果没有,有没有办法可以解析输出对象以推导出与给定名称关联的跟踪号? 我可以使用标准模式索引在交互式 R 会话中确定给定名称的关联跟踪号,但是当我尝试在闪亮的应用程序中应用相同的逻辑时,我收到一个错误: “$.shinyoutput 中的错误:从不允许闪亮的输出对象。” 下面是一个最小的例子。 观察Remove按钮的观察者都没有实际工作,但他们应该对我试图实现的功能给出一个想法。 library(shiny) library(plotly) ui <- fluidPage( textInput("TraceName", "Trace Name"), actionButton("Add","Add Trace"), actionButton("Remove","Remove Trace"), plotlyOutput("MyPlot") ) server <- function(input,output,session) { ## Creaing the plot output$MyPlot <-
  • 是否可以在shinyWidgets的函数pickerInput中使用尚未上传的数据框列的唯一值作为“选择”?(Is it possible to use the unique values of a dataframe column that is yet to upload as 'choices' in the function pickerInput of shinyWidgets?)
    问题
  • Using autoplotly in shiny app with user selected columns
    I am making a shiny app that allows the user to upload a CSV, then select the independent and dependent variables. Right now I am able to upload a file, select variables and run regression analysis. But, I am stuck at the step where I would pass the lm object to autoplot then making it interactive via autoplotly in a new tab. How can I create interactive regression plots via using user selected variables in a shiny app? UI ui = navbarPage(tabPanel("Regression Analysis", dataTableOutput('mytable'), sidebarLayout( sidebarPanel(width=3, fileInput("file1", "Please choose a CSV file", multiple = T
  • Shiny:在鼠标悬停点带有垂直线和数据标签的交互式 ggplot(Shiny: Interactive ggplot with Vertical Line and Data Labels at Mouse Hover Point)
    问题 我想看看我是否可以在 Shiny 应用程序中创建一个折线图: 画一条垂直线,然后标签 最接近每个geom_line()上鼠标悬停点的 x 值的数据点,类似于这两个图表的组合: 通过鼠标悬停点的垂直线鼠标悬停点 x 值处点的数据标签 这是我第一次尝试使我的 ggplot 图具有交互性。 我遇到了一些奇怪的行为,我希望有人可以向我解释。 我的可重现示例如下。 它创建两个系列并使用geom_line()绘制它们。 我离我想要的最终状态还有几步(上面解释过),但我的直接问题是: 当鼠标超出绘图范围时,如何摆脱垂直线? 我尝试过的一切(比如将NULL传递给xintercept如果input$plot_hover是NULL )都会导致绘图出错。 为什么,当鼠标在图的边界内时, geom_vline反弹? 为什么当鼠标停止移动时它会回到 x = 0? 谢谢。 library(shiny) library(ggplot2) library(tidyr) library(dplyr) ui <- fluidPage( titlePanel("Interactive Plot"), sidebarLayout( sidebarPanel( sliderInput("points", "Number of points:", min = 10, max = 50, value = 25)
  • 在闪亮的应用程序中使用用户选择的列自动绘图(Using autoplotly in shiny app with user selected columns)
    问题
  • 在 Shiny-rstudio 中的 rhandsontable 中的反应/计算列(Reactive/Calculate Columns in rhandsontable in shiny- rstudio)
    问题 我正在尝试向以下交互式表添加自定义验证。 我想要做的是如下。 该表包含三个变量,即 mpg、cyl 和 disp。 假设我编辑了第一行的 mpg 值。 然后一旦我按下回车按钮,第一行的 disp 值应该自动更改为 disp=mpg/cyl。 这里 mpg 值是我编辑的新值。 同样,如果我在特定行中再次编辑 cyl,则该特定行的 disp 应自动更改为 disp=mpg/cyl。 此外,如果我更改特定行的 disp 值,则该特定行的 cyl 应自动更改为 mpg/cyl。 我试图找出一种方法来做到这一点。 library(shiny) library(datasets) ui=fluidPage( rHandsontableOutput("table1") ) server=function(input, output, session) { mt=reactive({ datacopy= mtcars[, names(mtcars) %in% c("mpg" , "cyl" , "disp")] datacopy=data.table(datacopy) }) output$table1=renderRHandsontable({ rhandsontable(mt()) }) } shinyApp(ui,server) 回答1 我想这会实现你想要的: library
  • Removing traces by name using plotlyProxy (or accessing output schema in reactive context)
    I am attempting to use the plotlyProxy() functionality (Documented here) to allow users of a shiny application to add and remove traces with minimal latency. Adding traces proves to be relatively simple, but I'm having difficulty figuring out how to remove traces by name (I'm only seeing documented examples that remove by trace number). Is there a way to remove traces by name using plotlyProxy()? If not, is there a way that I can parse through the output object to derive what trace numbers are associated with a given name? I can determine the associated trace number of a given name in an
  • R中的选择输入更新? 在相关的两个选项卡中选择输入(SelectInputUpdate in R? SelectInput in two tabs that are related)
    问题 下面的新代码示例,我试图在所有三个选项卡中链接 selectInput。 在下面的示例中,前两个选项卡 selectInputs 已链接,但我试图将所有三个选项卡链接。 有什么办法可以把这三个联系起来吗? #`````````````````````````````````````` a <- list("2016", "MALE", "25", "50") b <- list("2017", "FEMALE", "5", "100") c <- list("2017", "MALE", "15", "75") d <- list("2016", "MALE", "10", "35") e <- list("2017", "FEMALE","55", "20") data <- rbind(a,b,c,d,e) #`````````````````````````````````````` ## UI library(shiny) if(interactive()){ ui = fluidPage( navbarPage("", #`````````````````````````````````````` ## SHOES TAB tabPanel("SHOES", fluidRow( column(2, "", selectInput("shoes_year",
  • 在 Shiny 中有效地渲染大数据图中的数据点(Efficient rendering of data points from large data plot in Shiny)
    问题 目标 实施一个闪亮的应用程序来有效地可视化和调整上传的数据集。 每组可能包含 100000 到 200000 行。 数据调整完成后,即可下载调整后的数据。 在步骤: 数据上传数据选择和可视化数据(点)去除下载选项 问题 虽然该应用程序可以正常工作,但数据可视化和删除需要太多时间。 代码 样本数据 生成了一些样本数据。 数据可以上传到闪亮的应用程序。 样本数据分布与我的实际数据不相似。 实际数据包含清晰可辨的异常值,看起来像带有峰值的光谱。 a = sample(1:1e12, 1e5, replace=TRUE) b = sample(1:1e12, 1e5, replace=TRUE) dummy1 = data.frame(Frequency = a, Amplitude = a) dummy2 = data.frame(Frequency = b, Amplitude = b) dummy3 = data.frame(Frequency = a, Amplitude = b) # Sample data write.csv(dummy1,'dummy1.csv') write.csv(dummy2,'dummy2.csv') write.csv(dummy3,'dummy2.csv') 闪亮的应用 该应用程序获取上传的数据并绘制它。 (可以将样本虚拟数据上传到应用程序。
  • 将动态 UI 保存到 Global R 工作区(Saving Dynamic UI to Global R workspace)
    问题 我正在尝试创建一个 Shiny 应用程序,它可以在 R 工作区中使用,为一些代码创建一个用户友好的前端 - 这样某人只需输入并单击一些框,而不是自己创建列表和数据框 - 然后他们输入将存储在 R 中的工作区中以执行代码。 我基本上已经改编了其他人的代码,但无法弄清楚如何保存名为 col 的动态创建的 UI - 它可以进行文本输入,因此如果人们在其中输入内容,则会被保存。 当我尝试添加某种方式来保存它时,我得到一个错误 Operation not allowed without an active react context。 (你试图做一些只能从反应式表达式或观察者内部完成的事情。)。 代码如下,有没有办法保存文本输入中的信息? CrossBreakUI <- function(id, number) { ns <- NS(id) tagList( fluidRow( column(4, numericInput(ns("n"), "Number of Groups in Cross-Break", value=5, min=1), uiOutput(ns("col"))) ) ) } variables <- function(input, output, session, variable.number){ output$textInput <- renderUI({
  • 根据闪亮的反应输入,使用不同的数据集和列绘制不同的反应图(Plot different reactive graph using different dataset and columns based on reacitve inputs in shiny)
    问题 我目前正在尝试自学闪亮,但遇到了一些麻烦。 我想制作一个应用程序,它有一个菜单,用于用户想要绘制的数据集,然后是另一个菜单,用于他们想要绘制的变量(针对日期列) 我已经设法让反应式菜单正常工作,但我正在努力弄清楚如何“调用”选定的数据集。 我已经阅读了很多帖子(例如 1,2),但似乎都没有处理多数据集问题。 我的代码目前看起来像这样,我的问题出现在最后几行(如何在 outVar() 中访问 mydata?!?)。 如果有人能指出我正确的方向,那就太好了! library(shiny) library(ggplot2) datafiles<-c("Data/try2.txt","Data/Poland.txt","Data/Romania.txt","Data/Hungary.txt","Data/KHR.txt") runApp(list( ui = bootstrapPage( selectInput('dataset', 'Choose Dataset', datafiles), selectInput('columns', 'Columns', ""), plotOutput('graph') ), server = function(input, output, session){ outVar = reactive({ mydata = read.table