我正在尝试制作一个简单的应用程序来比较两个R文件

时间:2019-07-02 21:29:09

标签: r shiny

我正在尝试使用diffR函数接受两个.R文件来比较闪亮应用程序中的差异。有人可以上传两个R文件,然后它将使用diffR进行输出。

我可以在本地运行代码,在本地将文件1和文件2定义为目录,然后并排输出代码以显示差异。它突出显示了差异,然后可以进行调整。

server <- function(input, output, session) {

    output$contents <- renderPrint({
    info_old <- input$old_file

    if(is.null(info_old))
        return(null)

    df_old <- readLines(info_old$datapath)
    df_old
})

    output$new_contents <- renderPrint({


    info_new <- input$new_file
    if(is.null(info_new)){return()}

    df_new <- readLines(info_new$datapath)
    df_new
})
    output$exdiff <- renderDiffr({
        diffr(info_old(), info_new(), wordWrap = input$wordWrap,
              before = "Original_File", after = "New File")
    })
}

我知道这很简单,其中old_file和new_file都在生成侧。此堆栈答案准确显示了我在寻找什么:

In R, find whether two files differ

使用diffr软件包的位置。我只是希望用户能够上传两个R文件,所以并排比较而不是全局定义文件a和b。

1 个答案:

答案 0 :(得分:1)

您可以使用上载文件给定的数据路径:input$files[[1, 'datapath']]

如果您愿意,请对您的(好的)尝试做些小的评论。 diffr()函数要求连接到文件而不是内容本身。我也遇到了同样的陷阱。因此,如果您删除代码中的readLines(),则应该非常接近。

您可能需要进行测试,以确保上传的文件的长度不小于或大于2,以确保应用程序在发生以下情况时不会崩溃:仅提供一个文件。

可复制的示例:

write.csv2(
  x = "diff same", 
  file = "test.csv"
)

write.csv2(
  x = "diffhere same", 
  file = "test2.csv"
)


ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      fileInput(
        inputId = "files", 
        label = "Choose CSV File", 
        multiple = TRUE,
        accept = c("text/csv",
                  "text/comma-separated-values,text/plain",
                  ".csv")
      )
    ),
    mainPanel(
      tableOutput("contents"),
      diffrOutput("exdiff")
    )
  )
)

server <- function(input, output) {
  output$exdiff <- renderDiffr({
    req(input$files)

    diffr(
       file1 = input$files[[1, 'datapath']], 
       file2 = input$files[[2, 'datapath']], 
       wordWrap = TRUE,
       before = "f1", 
       after = "f2"
    )
  })
}

shinyApp(ui, server)