在R Shiny中运行系统命令

时间:2018-09-29 20:21:03

标签: r shiny system-calls

我具有以下服务器功能,该功能从ui的inputFile选项卡中获取两个输入文件。

library(shiny)

ui <- fluidPage(
  fileInput("CF", label = "CF"),
  fileInput("ED", label = "ED"),
  actionButton("Run", "Run")
)


server <- function(input, output, session) {
    cf_file <- reactive({ 
        cfFile <- input$CF
        return(cfFile$datapath)
    })

    ed_file <- reactive({ 
        edFile <- input$ED
        return(edFile$datapath)
    })

    table_content <- eventReactive(input$Run, {
        req(input$ED$datapath)
        req(input$CF$datapath)
        file_ed <- ed_file()
        file_cf <- cf_file()

        ##the system command uses external program which takes input files (file_cf and file_ed) from fileInput. The command will look like:
        #/bin/qt con ed -i file_cf -p file_ed > file_ed.db#

        system(paste("/bin/qt con ed -i", file_cf, "-p", file_ed, ">", file_ed,".db" ))
    })
}
shinyApp(ui, server)

我在这里有两个问题:

1)系统命令在此处不起作用,并显示错误消息:

qt: Error reading file '/var/folders/z0/kms9x7hd6hgdtbtk3kxnjcjxw2_l57/T//RtmpISFd3V/aac5eff9961beb644d8ec5e0/0.phe': End of file

系统命令正在获取两个输入文件,并通过在输入文件之一中添加“ .db”来写入输出文件。谁能指出上面的系统命令出了什么问题?

我在https://community.rstudio.com/t/system-call-within-r-shiny/11405/3上遵循了类似的查询

2)如果系统命令有效,我如何将输出文件中的输出呈现为table_content?

尝试与错误: 我尝试使用paste0(),但没有运气,这次出现了另一个错误,即它不读取输入文件file_cf和file_ed。

 system(paste0("/bin/qt con ed -i ", file_cf, " -p ", file_ed, " > ", file_ed,".db"))

`Error accessing  file '/var/folders/z0/kms9x7hd6hgdtbtk3kxnjcjxw2_l57/T//RtmpjqfSir/6a3263bc18297e4b6567979e/0.cf -p/var/folders/z0/kms9x7hd6hgdtbtk3kxnjcjxw2_l57/T//RtmpjqfSir/02b964d65d0f0b1a9476a8be/0.ed': No such file or directory` 

然后使用system2:

system2(paste0("/bin/qt con ed -i ",file_cf, " -p ", file_ed, " > ", file_ed,".db" ))

sh: /bin/qt con ed -i /var/folders/z0/kms9x7hd6hgdtbtk3kxnjcjxw2_l57/T//RtmpjqfSir/ebc57ae122e171f074281112/0.cf -p /var/folders/z0/kms9x7hd6hgdtbtk3kxnjcjxw2_l57/T//RtmpjqfSir/15a75f8fbe5992bd82ab8a22/0.ed > /var/folders/z0/kms9x7hd6hgdtbtk3kxnjcjxw2_l57/T//RtmpjqfSir/15a75f8fbe5992bd82ab8a22/0.ed.db: No such file or directory
Warning in system2(paste0("/bin/qt con ed -i ",  :
  error in running command

R上面的sh:命令在R外部的shell中运行时使用它生成的tmp路径生成,并且可以在tmp路径中看到输出文件。但是,当使用systempaste0在R中运行它时,会出现上述错误。

1 个答案:

答案 0 :(得分:0)

我不知道您正在使用哪些文件作为输入,因此我只是使用图像并查看了即将出现的系统命令,就像这样:

/bin/qt con ed -i C:\Users\**\AppData\Local\Temp\RtmpohWHcF/08b770ef9620ce852841b792/0.png -p C:\Users\**\AppData\Local\Temp\RtmpohWHcF/b2fdf736bf904194d709b66c/0.png > C:\Users\**\AppData\Local\Temp\RtmpohWHcF/b2fdf736bf904194d709b66c/0.png .db

问题出在行尾,因为.db之前有一个空格。 我不知道这是否可以解决您的问题,但这可能是第一步;)

所以只需尝试以下命令:

paste0("/bin/qt con ed -i ", file_cf, " -p ", file_ed, " > ", file_ed,".db")

它使用paste0,其中不包含空格,因此您将它们包括在字符串部分中。但是,系统命令的最后一个输入将具有双扩展名(例如.png.db)。要摆脱这种情况,您可以使用:

file_ed2 <- tools::file_path_sans_ext(file_ed)

并将其分配给最后一个系统cmd输入。

如果还是不能正常运行,您还可以尝试使用system2的{​​{1}}命令代替。有时候对我来说效果更好。

要回答问题2 ,我需要知道它是什么样的输出以及如何加载和呈现它?但是无论如何,也许system函数可以在这里工作。

-应用

reactivePoll