Список путей к файлам для итеративного прохождения через исходную функцию python в Shiny

#r #shiny #reticulate

#r #блестящий #сетчатый

Вопрос:

Я придумал функцию python, которая, как я подтвердил, работает просто отлично. Я пытаюсь поместить это в блестящее приложение, используя Shiny’s reticulate . Я не очень хорошо знаком с блестящим, но мне все равно нужно его использовать.

Чтобы дать немного информации о том, что я делаю, я написал код на python, который принимает несколько файлов и сопоставляет строки на основе одного общего списка строк. Этот код отлично работает, когда я запускаю файлы python на своей машине.

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

До сих пор я настраивал блестящее приложение так, чтобы оно могло принимать несколько файлов. Мне трудно думать о том, как я могу использовать reactive список имен путей к файлам, чтобы затем отправить свой код на python (который включает в себя шаг для открытия и чтения файла), чтобы он мог сделать свое дело.

Это код, который у меня есть для моего приложения до сих пор:

 library(shiny) library(shinyFiles)  # define UI ui lt;- fluidPage(  titlePanel('Counter of Gendered Language'),  fileInput("upload", "Choose a folder",  multiple = TRUE,  accept = c('text')),  tableOutput('text'),  downloadButton('output', 'Download Count File .csv')) # define server behavior server lt;- function(input, output){  # Setup  #* Load libraries  library(reticulate)  #* Use virtual environment for python dependencies use_virtualenv('file/path/py_venv', required = TRUE)  #* Source code  source_python('code/counting_gendered_words.py')  #* Load list of words to match raw text against  dictionary lt;- read.csv('data/word_rating.csv')  text lt;- reactive(  list lt;- list.files(path = input$upload[['name']])  )  output$counted lt;- gendered_word_counter(dictionary, text())  output$downloadData lt;- downloadHandler(  filename = function(){  paste0(input$upload, ".csv")  },  content = function(file){  vroom::vroom_write(text$counted, file)  }  ) }  # Run the application  shinyApp(ui = ui, server = server)  

Что это говорит мне, когда я запускаю это приложение, так это то, что:

Ошибка : Операция не разрешена без активного реактивного контекста.

  • Вы пытались сделать то, что можно сделать только изнутри реактивного потребителя.

Поэтому то, что я хочу сделать, это в основном просто передать каждое имя файла, которое кто-то загружает в приложение, и передать имя этого файла в мою gendered_word_counter() функцию python.

Как бы я поступил с этим?

Я очень уверен, что я просто новичок, и это, вероятно, очень простое решение. Любая помощь от тех, кому удобнее с Shiny, будет очень признательна!

Редактировать: Я замечаю, что мой код вызывает только имена файлов, что для меня бессмысленно без содержимого загруженных файлов! Было бы лучше, если бы я читал файлы в приложении shiny, а не в своем файле .py?

Ответ №1:

Я не могу воспроизвести приложение без кода python, но я вижу, что эта строка:

output$counted lt;- gendered_word_counter(dictionary, text())

имеет реактивный объект ( text() ), вызываемый без реактивного контекста. Он должен быть завернут в observe или observeEvent .

 observe({  output$counted lt;- gendered_word_counter(dictionary, text()) })  

Также давайте добавим здесь скобки:

 content = function(file){  vroom::vroom_write(text()$counted, file)  }