#r #shiny
#r #блестящий
Вопрос:
Итак, у меня есть это воспроизводимое приложение shiny с ползунком:
library(bold)
library(shiny)
library(shinyWidgets)
library(stringr)
library(readr)
grades2<-function(groups){
taxon<-bold_seqspec(taxon=groups, format = "tsv")
taxon2<-taxon[taxon$species_name!=""|is.na(taxon$species_name),]
taxon2<-taxon2[!(taxon2$bin_uri == "" | is.na(taxon2$bin_uri)), ]
taxon2$base_number=str_count(taxon2$nucleotides, pattern="[A-Z]")
taxon2<-taxon2[(taxon2$base_number>input$seqsize),]
assign('taxon',taxon,envir=.GlobalEnv)
}
ui <- navbarPage(title=tags$h3("APP"),tabPanel(column(12,align="center",tags$h4("Download"),tags$br(),
sliderInput("seqsize", "Mininum number of base pairs for sequences in reference library:",min = 0, max = 1000, value = 500),textOutput("SliderText"),
textInputAddon(inputId="taxa2",addon=icon("search"),width="500px",label=tags$h5(tags$strong("Enter the name of the taxonomic group or groups separated by commas, without spaces:")),placeholder="Example: Carnivora,Ursidae,Artiodactyla,Soricomorpha"),
downloadButton("downloadData_2","Download"))))
server <- function(input, output){
taxaInput_2 <- reactive({grades2(unlist(strsplit(input$taxa2, ",")))})
output$downloadData_2 <- downloadHandler(
filename = function() {
paste(to_upper_camel_case(input$taxa2,sep_out=","), ".tsv")
},
content = function(file) {
shiny::withProgress(
value=10,
{
shiny::incProgress(10/10)
write_tsv(taxaInput_2(), file)
}
)
}
)
}
shinyApp(ui=ui,server=server)
Я ввел ввод ползунка, но я не знаю, как извлечь значение, выбранное пользователем, чтобы использовать его в моей функции с именем «grades2». Я хочу, чтобы переменная «input $ seqsize» в этой строке кода была значением, выбранным пользователем в ползунке:
taxon2<-taxon2[(taxon2$base_number>seqsize),]
Проблема в том, что я получаю следующую ошибку:
Warning: Error in [.data.frame: object 'input' not found
Заранее благодарю вас за любые ответы
Комментарии:
1. Я предлагаю добавить для него аргумент в вашу функцию и включить его из реактивной части. То есть
grades2<-function(groups, size) { ... ; taxon2<-taxon2[(taxon2$base_number>size),]; ... }
. Затем вызовите его какreactive({grades2(unlist(strsplit(input$taxa2, ",")),input$seqsize)})
. (Извините, код в комментариях воняет.)
Ответ №1:
Я предлагаю вам переписать вашу функцию, чтобы убрать любое понятие реактивности: сделайте ее наивной по отношению к тому факту, что она работает внутри shiny
.
grades2<-function(groups, size){
taxon<-bold_seqspec(taxon=groups, format = "tsv")
taxon2<-taxon[taxon$species_name!=""|is.na(taxon$species_name),]
taxon2<-taxon2[!(taxon2$bin_uri == "" | is.na(taxon2$bin_uri)), ]
taxon2$base_number=str_count(taxon2$nucleotides, pattern="[A-Z]")
taxon2<-taxon2[(taxon2$base_number>size),]
assign('taxon',taxon,envir=.GlobalEnv)
}
и
taxaInput_2 <- reactive({grades2(unlist(strsplit(input$taxa2, ",")), input$seqsize)})