Оригинальный вопрос размещен здесь:Shiny reactive Unexpected Behavior
Вопрос повторного размещена здесь, в попытке улучшить первоначальный вопрос отвечал ранее в ссылке, указанной выше, я не смог получать любую помощь.Блестящая реактивная функция не обновляется, как и ожидалось
Цель: Короче говоря, цель этого приложения, чтобы позволить пользователю выполнять поиск, фильтр и Мясорубка данные, предоставленные в от в dataframe, на основе различных материалов, предоставляемых пользователю.
В качестве функции функции server
для определения индексов, соответствующих входам пользователя, определена реактивная функция с именем index
. Реактивная функция, index
, использует функции grep
и which
для определения соответствующих индексов в кадре данных df
.
Я включил воспроизводимый код и попытался включить комментарии, где это необходимо.
Дальнейшее объяснение о коде:
Название этого вопроса только мое собственное предположение, и оно основано на предположении, что код внутри index
является правильным. может возникнуть фундаментальная проблема с кодом в пределах index
, а не с реактивностью функции index
. Чтобы проверить это, как часть функции server
, я включил функцию printIndex
, чтобы распечатать результаты index
, чтобы убедиться, что она работает правильно.
Я лично пробовал печатать результаты ind.j
, ind.c
, ind.l
, ind.d
, ind.s
и ind.all
каждого из них в отдельности в консоль и казалось, что они все производят правильные результаты. Однако, когда я тестирую результаты ind
, это не совсем то, что я ожидаю, поэтому я задаюсь вопросом, является ли реактивность или линия кода проблематичной. То, что намеревается сделать ind
, - это взять список всех искомых индексов, хранящихся в ind.all
, и рекурсивно применить функцию intersect
, чтобы найти общие элементы из всех подсписок в ind.all
.
Как я уже упоминал выше, функция index
работает отлично для отдельных фильтров. Однако, когда я вводим значения для всех индексов, как пользователь, функция не обновляется до нужного списка индексов, как ожидалось. Например, вы можете попробовать ввод «приложения» в Работа TextInput, «Gas Drive Global» в компании selectizeInput, и «Калгари» в Местоположение TextInput в то же время и ударил поиск!. Вы увидите, что таблица данных не возвращает никаких результатов, в то время как это явно соответствует 1-й строке кадра данных df
.
#Load required packages
ListofPackages= c('shiny','ggplot2','scales')
lapply(ListofPackages,require,character.only=TRUE)
#Define the dataframe on which the search will be performed
df <- data.frame(Job=c('Applications Engineer ââ¬â Gas Drive',
'Engineer, Operations',
'Project Engineer',
'Project Engineer (Oil & Gas)',
'Project Engineer',
'Junior Engineer',
'Engineer, Operations',
'Research and Development (R&D) Junior Engineer',
'JUNIOR QUALITY ENGINEER',
'Junior Systems Design and Support Engineer',
'Mechanical Engineer Calgary, AB',
'Applications Engineer',
'Project Engineer',
'Pipeline Engineer',
'Development Engineer',
'Specialist Engineering Finance',
'Mechanical Engineer - Sudbury',
'Project Cost Analyst (12 month term)',
'Project Controls Functional Analyst',
'Project Controls Professionals'),
Company=c('Gas Drive Global',
'Agrium Wholesale',
'City of Calgary',
'Stantec',
'Shell',
'Canadian National Railway',
'Pembina Pipeline Corporation',
'Velan Inc.',
'G.W. Goudreau Personnel Services Ltd',
'Stratified Automotive Controls',
'Pason Systems Corp.',
'Howden',
'Plains Midstream Canada',
'Amec Foster Wheeler',
'Red Bend Software',
'Canadian Pacific',
'GENIVAR',
'Thales',
'AltaGas Ltd.','BEMAC Construction Corp.'),
Location=c('Calgary',
'Redwater',
'Calgary',
'Edmonton',
'Sarnia',
'Montréal',
'Calgary',
'Montréal',
'Windsor',
'Vancouver',
'Calgary',
'Winnipeg',
'Calgary',
'Calgary',
'Engineer',
'Calgary',
'Greater Sudbury',
'Ottawa',
'Calgary',
'Calgary'),
Posted=c(1,
1,
1,
2,
2,
1,
4,
5,
6,
4,
1,
5,
5,
3,
1,
1,
15,
1,
1,
13),
Source=c('Indeed',
'Indeed',
'Indeed',
'Indeed',
'Indeed',
'Indeed',
'Indeed',
'Indeed',
'Indeed',
'Indeed',
'Indeed',
'Indeed',
'Indeed',
'Indeed',
'Indeed',
'Indeed',
'Indeed',
'Indeed',
'Indeed',
'Indeed'),
url=c('http://ca.indeed.com/rc/clk?jk=2371e16aab902f84',
'http://ca.indeed.com/rc/clk?jk=428facb738edd397',
'http://ca.indeed.com/rc/clk?jk=e15d8fe4d362279b',
'http://ca.indeed.com/rc/clk?jk=28c1464fd4e28b24',
'http://ca.indeed.com/rc/clk?jk=736ec57bf6902b93',
'http://ca.indeed.com/rc/clk?jk=bdc9999eae922645',
'http://ca.indeed.com/rc/clk?jk=3a4588fca0e600b1',
'http://ca.indeed.com/rc/clk?jk=71f1abcd100850c6',
'http://ca.indeed.com/cmp/G.W.Goudreau-Personnel-Services-Ltd/jobs/Junior-Quality-Engineer-3237601a1f3d3abc?r=1',
'http://ca.indeed.com/cmp/Stratified-Automotive-Controls/jobs/Junior-System-Design-Support-Engineer-1d916a435e69b8ce?r=1',
'http://ca.indeed.com/rc/clk?jk=fca9a784a37ece8a',
'http://ca.indeed.com/rc/clk?jk=b2d0975c638c03a8',
'http://ca.indeed.com/rc/clk?jk=c92725272c5f9ced',
'http://ca.indeed.com/rc/clk?jk=cd97c050df64787c',
'http://ca.indeed.com/rc/clk?jk=e6e278ed52532f73',
'http://ca.indeed.com/rc/clk?jk=a1f14d52c7798d7b',
'http://ca.indeed.com/rc/clk?jk=112350d5e020241f',
'http://ca.indeed.com/rc/clk?jk=a324c2dcade7dc5c',
'http://ca.indeed.com/rc/clk?jk=77895efdf28ad6fa',
'http://ca.indeed.com/cmp/BEMAC-Construction-Corp./jobs/Project-Control-Professional-90796e764f064a51?r=1'))
server <- function(input,output,session){
#Server-side search for the choices argument of selectizeInput in ui.R
updateSelectizeInput(session, 'c', choices = as.character(df$Company), server = TRUE)
#Create a reactive function to look up the indices correponding to the user's inputs
index <- reactive({
ind.j <- if(input$j=='') NULL else grep(input$j,df[,'Job'],ignore.case = T)
ind.c <- {tmp<-lapply(input$c, function(x) {which(df[,'Company']==x)}); Reduce(union,tmp)}
ind.l <- if(input$l=='') NULL else grep(input$l,df[,'Location'],ignore.case = T)
ind.d <- which(df[,'Posted']<=input$d)
ind.s <- {tmp<-lapply(input$s, function(x) {which(df[,'Source']==x)}); Reduce(union,tmp)}
ind.all <- list(ind.j,ind.c,ind.l,ind.d,ind.s)
ind <- if(is.null(ind.s)) NULL else {ind.null<- which(lapply(ind.all,is.null)==TRUE) ;Reduce(intersect,ind.all[-ind.null])}
})
#Create a reactive function to return the search results by returning the indices looked up in the index function above
search <- reactive({
df[index(),]
})
#Print the results of the index function above to test if it works properly
output$printIndex <- renderUI({
list(index())
})
#Send the searchresult table to ui.R to print the results of the search function above
output$searchresult <- renderDataTable({
input$action6 #triggered only when button is pressed
if(input$action6==0) return()
else{isolate({
transformed <- transform(search(), Link = paste('<a href = ', shQuote(url), '>', 'Click</a>'))
transformed <- transformed[,c(1:3,5,7,4,6)] #Rearrange columns
transformed[-7] #Remove last column
})
}
}, option=list(autoWidth=FALSE,pageLength=100,
columnDefs = list(list(targets =c(5,6) -1, searchable = FALSE),list(sWidth=c("100px")))))
}
ui <- shinyUI(fluidPage(
#Display datatable filters on top
tags$head(tags$style("tfoot {display: table-header-group;}")),
#Add a title
h1('Power Search'),
#Use the Sidebar layout
sidebarLayout(
sidebarPanel(
#Add various fields for the user in order to search the dataframe
h5('Note: Running the app takes a little while at startup.'),
helpText('Job:'),
textInput('j',''),
helpText('Company:'),
selectizeInput('c','',choices=NULL,multiple=T),
helpText('Location:'),
textInput('l',''),
sliderInput('d','Posted (days ago)',min = 0,max = 60,step = 5,value = 60),
checkboxGroupInput('s','',choices = c('Indeed','Glassdoor'),selected = c('Indeed','Glassdoor')),
actionButton('action6','Search!')
),
mainPanel(
#Display results
htmlOutput('printIndex'),
dataTableOutput('searchresult')
)
)
))
shinyApp(ui = ui, server = server)
Большое спасибо John !! Поэтому я предполагаю, что проблема была в том случае, когда 'ind.null' = 0 и поэтому' ind.all [-0] 'не будет работать. и обходной путь, как вы предположили, заключается в подмножестве 'ind.all' с логическим вектором, а не с числовым вектором. Это подтверждает мое понимание здесь? –
'integer (0)' - пустой целочисленный вектор, а не '0L'. Отрицание пустого целочисленного вектора не влияет. Подмножество с использованием пустого целочисленного вектора возвращает пустой результат. – jdharrison
В качестве ответа на этот вопрос и ссылку на ранее опубликованный вопрос [здесь] (http://stackoverflow.com/questions/27325855/shiny-error-arguments-imply-differing-number-of-rows), пожалуйста, попробуйте сняв флажок «Действительно» или попробовав любую другую комбинацию, которая приводит к фрейму с 0 строками, а затем нажмите «Поиск» и посмотрите, что произойдет. Мне сказали, что эта ошибка была решена в блестящей версии разработки, но я попробовал ее с версией разработки, и у меня все еще была та же ошибка. Можете ли вы пролить свет на то, что может вызвать проблему для случаев с 0 строками? –