#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) }