gpt4 book ai didi

r - Shiny 应用程序 (R) 中的交互式目录输入

转载 作者:行者123 更新时间:2023-12-03 21:51:41 27 4
gpt4 key购买 nike

我正在构建一个 Shiny 的应用程序,它需要用户在本地机器上选择一个文件夹,其中包含应用程序要处理的文件。

我正在使用建议的解决方案 here .这在本地计算机上工作正常,但如果应用程序部署到 shinyapps 服务器则不起作用。
该解决方案的作者确认它仅设计用于本地 Shiny 应用程序,因为它会调用 OS shell 来显示目录对话框。

我想知道目录对话框是否有不同的解决方案,它适用于已部署的 Shiny 应用程序(我正在部署到 shinyapps.io)。

编辑:请注意我不能使用 fileInput接口(interface)有两个原因:

  • 该应用程序的用户不是技术人员,他们不知道该文件夹中的哪些文件被该应用程序使用。
  • 选中的文件夹可能包含其他文件夹,需要的文件位于其中,这样即使fileInput接口(interface)有multiple也不可能一次选中所有文件。选项启用。

  • 文件夹/文件结构不是我可以更改的,它是从医疗设备按原样下载的,因此我唯一能从用户那里得到的就是指定父文件夹,其余的应该在 R 代码中完成。

    最佳答案

    这是一个基于使用“webkitdirectory”属性的工作示例。目前该属性已被 Chrome、Opera 和 Safari(移动和桌面)支持,应该会在 9 月发布的 Firefox 49 中得到支持。
    更多信息 here .它也适用于子目录。

    它需要在 ui.R 中使用 tags 关键字。我通过上传三个 csv 文件对其进行了测试,每个文件包含三个由逗号分隔的数字。使用 Chrome 和 Opera 在本地和 shinyapps.io 上测试。这是代码:

    用户界面

        library(shiny)
    library(DT)

    shinyUI(tagList(fluidPage(theme = "bootstrap.css",
    includeScript("./www/text.js"),
    titlePanel("Folder content upload"),

    fluidRow(
    column(4,
    wellPanel(
    tags$div(class="form-group shiny-input-container",
    tags$div(tags$label("File input")),
    tags$div(tags$label("Choose folder", class="btn btn-primary",
    tags$input(id = "fileIn", webkitdirectory = TRUE, type = "file", style="display: none;", onchange="pressed()"))),
    tags$label("No folder choosen", id = "noFile"),
    tags$div(id="fileIn_progress", class="progress progress-striped active shiny-file-input-progress",
    tags$div(class="progress-bar")
    )
    ),
    verbatimTextOutput("results")
    )
    ),
    column(8,
    tabsetPanel(
    tabPanel("Files table", dataTableOutput("tbl")),
    tabPanel("Files list", dataTableOutput("tbl2"))
    )
    )
    )
    ),
    HTML("<script type='text/javascript' src='getFolders.js'></script>")
    )

    )

    服务器.R
        library(shiny)
    library(ggplot2)
    library(DT)

    shinyServer(function(input, output, session) {
    df <- reactive({
    inFiles <- input$fileIn
    df <- data.frame()
    if (is.null(inFiles))
    return(NULL)
    for (i in seq_along(inFiles$datapath)) {
    tmp <- read.csv(inFiles$datapath[i], header = FALSE)
    df <- rbind(df, tmp)
    }
    df

    })
    output$tbl <- DT::renderDataTable(
    df()
    )
    output$tbl2 <- DT::renderDataTable(
    input$fileIn
    )
    output$results = renderPrint({
    input$mydata
    })

    })

    文本.js
    window.pressed = function(){
    var a = document.getElementById('fileIn');
    if(a.value === "")
    {
    noFile.innerHTML = "No folder choosen";
    }
    else
    {
    noFile.innerHTML = "";
    }
    };

    获取文件夹.js
         document.getElementById("fileIn").addEventListener("change", function(e) {

    let files = e.target.files;
    var arr = new Array(files.length*2);
    for (let i=0; i<files.length; i++) {

    //console.log(files[i].webkitRelativePath);
    //console.log(files[i].name);
    arr[i] = files[i].webkitRelativePath;
    arr[i+files.length] = files[i].name;


    }

    Shiny.onInputChange("mydata", arr);

    });

    让我知道这是否有帮助。

    关于r - Shiny 应用程序 (R) 中的交互式目录输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39196743/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com