Запустите системную команду в R Shiny - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть следующая серверная функция, которая берет два входных файла с вкладки 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» к одному из inputFile.Может ли кто-нибудь указать, что не так в приведенной выше системной команде?

Я выполнил аналогичный запрос на 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

Приведенная выше команда sh: генерируется R при запуске в оболочке вне R, используя пути tmp, она работает и может видеть выходные файлы вТМП путь.Но когда он запускается в R с использованием system и paste0, выдает вышеуказанную ошибку.

1 Ответ

0 голосов
/ 30 сентября 2018

Я не знаю, какие файлы вы используете в качестве входных данных, поэтому я просто использовал изображения и посмотрел на исходящую системную команду, которая выглядит следующим образом:

/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 Командный знак system.Иногда это работает лучше для меня.

Чтобы ответить на вопрос 2 , мне нужно знать, что это за вывод и как его загружать и отображать?Но в любом случае, возможно, здесь может работать функция reactivePoll.

- Приложение

library(shiny)

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

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()

    file_ed2 <- tools::file_path_sans_ext(file_ed)

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

  output$code <- renderText({
    req(table_content())
    table_content()
  })
}

shinyApp(ui, server)
...