У меня блестящее приложение с несколькими вкладками. Первая вкладка выполняет загрузку терминов от пользователя, а затем выполняет поиск по этим ключевым словам эластично при нажатии кнопки поиска, которая все находится в функции keyword_search
- моя проблема в том, что когда функция возвращает фрейм данных, этот фрейм является входнымglobal.R (text_global.R
), который мне не нужно запускать, пока пользователь не нажмет кнопку запуска, потому что в противном случае необходимые ему данные не будут доступны, пока не будет завершена функция keyword_search
, и приложение не выдаст ошибку. Еще одна проблема из-за этого заключается в том, что global.R застрял внутри eventReactive
, и поэтому я не уверен, мешает ли это использовать все переменные, созданные из этого файла, в остальных моих renderPlots.
Я понимаю, что наличие text_global.R
внутри eventReactive
заключает в себе его использование в других частях server
, но если я возьму его и сделаю его действительно глобальным, он будет запущен сразу после начала сеанса, и этопросто выдает ошибку моего приложения, потому что необходимые ему данные не существуют до тех пор, пока не будет запущена функция keyword_search
. Я попытался превратить eventReactive
в вызываемую функцию, добавив перед ней data() <-
и попытавшись использовать data () в качестве входных данных для text_global.R
, но это не сработало.
Вот мой блестящий код и то, что я сейчас пытаюсь (извините, это долго, но я хотел дать контекст):
ui <- navbarPage("App", theme = shinytheme("united"),
tabPanel("Search Your Terms",
titlePanel("Welcome"),
br(),
br(),
mainPanel("Please upload .XLSX file of the terms that you would like searched.",
br(),
br(),
"When you hit the search button, the code will pull the data, then you can navigate to the next tabs to run each type of analysis.",
br(),
br(),
fileInput('file1', 'Choose .xlsx file of terms:',
accept = c(".xlsx")),
actionButton("srch", "Search"),
tableOutput('contents'))),
tabPanel("Text Analysis",
titlePanel("Word Analysis"),
tabsetPanel(
tabPanel("Word Cloud",
sidebarPanel(width = 2,
actionButton("runtext", "Run Text Analysis"),
column(width = 10, align='center',
sliderInput("cloudsize", "Choose size (larger size shows more words)", min = .1, max = .9, value = .8, step = .1),
wordcloud2Output('wcplot', height = '500px'))),
tabPanel("Word Counts",
column( width = 10,
uiOutput("data1"),
plotOutput('counts'),
dataTableOutput("wordcount_dt"))),
tabPanel("Common Word Sequence",
column( width = 10,
uiOutput("data2"),
plotOutput('bigrams'),
dataTableOutput("bigram_dt")))
)),
tabPanel("Topic Modeling",
titlePanel("Topics"),
mainPanel(width = 10,
plotOutput("topics"),
dataTableOutput("topiccontents"))),
tabPanel("Social Network Analysis",
sidebarPanel(actionButton("netsrch", "Get"),
actionButton("runnet", "Create"),
width = 2),
mainPanel(visNetworkOutput("network"),
dataTableOutput("netdt")
))
)
server <- function(input, output) {
output$contents <- renderTable({
req(input$file1)
inFile <- input$file1
read_excel(inFile$datapath, 1)
})
source('keyword_search.R')
observeEvent(input$srch, {
inFile <- input$file1
file <- read_excel(inFile$datapath, 1)
file <- na.omit(file)
keyword_search(file)
showModal(modalDialog("Search finished, head to the next tab!"))
})
#this text_global.R has variables that are used for over half of my app, how #do I make its contents available for everything WITHOUT having it run the #moment the session starts?
eventReactive(input$runtext, {
source('text_global.R')
})
output$data1 <- renderUI({
selectInput("data1", "Choose which you would like to view:", choices = c(tfdf_forplot$report_name))
})
output$wcplot <- renderWordcloud2({
wordcloud2(forwordcloud2, size = (input$cloudsize), color = rep_len( c("orange", "teal", "gray"), nrow(forwordcloud2)))
})
output$counts <- renderPlot({
ggplot(tfdf_forplot[tfdf_forplot$report_name==input$reportchoose,]) + (aes(word, tf_idf)) +
geom_col(show.legend = FALSE, fill = '#cc3300', alpha = .9) +
labs(x = NULL, y = "tf-idf") +
coord_flip() +
theme_hc()
})
output$wordcount_dt <- renderDataTable({
datatable(tidy_output, colname = c("Report Name", "Word", "Count of Word", "Total Words", "tf", "idf", "tf_idf"))
})
output$data2 <- renderUI({
selectInput("data2", "Choose which device you would like to view:", choices = c(bigram_forplot$report_name))
})
output$bigrams <- renderPlot({
ggplot(bigram_forplot[bigram_forplot$report_name==input$reportchoose2,]) + aes(bigram, tf_idf, fill = report_name) +
theme(text = element_text(size=6)) +
geom_col(show.legend = FALSE, fill = '#cc3300', alpha = .9) +
labs(x = NULL, y = "tf-idf") +
coord_flip() +
theme_hc()
})
output$bigram_dt <- renderDataTable({
bigram_tf_idf
})
output$topics <- renderPlot({
ggplot(top_terms) + aes(term, beta, fill = factor(topic)) +
theme(text = element_text(size=10)) +
geom_col(show.legend = FALSE, fill = '#cc3300', alpha = .9) +
facet_wrap(~ topic, scales = "free") +
coord_flip()
})
output$topiccontents <- renderDataTable({
report_contents
})
eventReactive(input$runnet, {
source('sna_global.R')
})
output$network <- renderVisNetwork({
visIgraph(g2, idToLabel = TRUE) %>%
visOptions(highlightNearest = list(enabled = TRUE, labelOnly=FALSE,
degree=list(from = 1, to = 1), algorithm="hierarchical"),nodesIdSelection = TRUE)
})
source('report_search.R')
observeEvent(input$netsrch, {
report_search()
showModal(modalDialog("Network is Ready!"))
})
output$netdt <- renderDataTable({
datatable(nodelist, rownames = FALSE,
filter = 'top', extensions = 'Buttons',
options = list(columnDefs = list(list(className = 'dt-center', targets = c(0:3))),
pageLength = 10, dom = 'Bfrtip', buttons = c('copy', 'csv', 'excel', 'pdf', 'print')))
})
}
shinyApp(ui = ui, server = server)
Я просто получаю ошибки "not found" для всегов моем файле global.R, где должен быть renderPlots
. Любой совет был бы очень благодарен за то, как работать с выводом eventReactive
и использовать его в global.R, но также сделать так, чтобы global.R был доступен для остальных компонентов сервера, но не запускалсяпока кнопка не нажата. Извините, я знаю, что это сложный вопрос. Надеюсь, я все объяснил, хорошо
И все это работает за пределами блестящего приложения, поэтому я знаю, что сам код в global.R прав.