У меня есть функция, которая выделяет текст в кавычках, соответствующий тому, что пользователь ввел в два виджета textInput.Если во втором поле textInput нет ввода текста, возвращаемые результаты выделяют первый пробел, что нежелательно.
Я пытался использовать оператор if внутри моей функции без успеха.
highlight <- function(text, search1, search2) if (search2 != ""){
x <- unlist(strsplit(text, split = " ", fixed = T))
x[tolower(x) %in% tolower(c(search1, search2))] <- paste0("<mark>",
x[tolower(x) %in% tolower(c(search1, search2))], "</mark>")
paste(x, collapse = " ")
} else
x <- unlist(strsplit(text, split = " ", fixed = T))
x[tolower(x) %in% tolower(c(search1))] <- paste0("<mark>", x[tolower(x) %in% tolower(c(search1))], "</mark>")
paste(x, collapse = " ")
library(shiny)
library(shinydashboard)
highlight <- function(text, search1, search2) {
x <- unlist(strsplit(text, split = " ", fixed = T))
x[tolower(x) %in% tolower(c(search1, search2))] <- paste0("<mark>",
x[tolower(x) %in% tolower(c(search1, search2))], "</mark>")
paste(x, collapse = " ")
}
ui <- dashboardPage(
dashboardHeader(),
dashboardSidebar(
sidebarMenu(
menuItem("TexSearch", tabName = "Tabs", icon = icon("object-ungroup"))
)
),
dashboardBody(
tabItem(tabName = "Tabs",
fluidRow(
column(width=3,
box(
title="Search ",
solidHeader=TRUE,
collapsible=TRUE,
width=NULL,
textInput("quoteSearch1", " Search ", '', placeholder = "Type keyword/statement"),
textInput("quoteSearch2", " Search ", '', placeholder = "Type keyword/statement"),
submitButton("Search")
)
),
column( width=9,
tabBox(
width="100%",
tabPanel("tab1",
htmlOutput("quotesearchdetails")
)))))))
server <- function(input, output) {
output$quotesearchdetails <-renderUI({
outputed=""
author <- c('John Cage','Thomas Carlyle','Elbert Hubbard', 'Albert Einstein')
quote <- c('I cant understand why people are frightened of new ideas. Im frightened of the old ones.','The tragedy of life is not so much what men suffer, but rather what they miss.','The greatest mistake you can make in life is to be continually fearing you will make one.', 'Anyone who has never made a mistake has never tried anything new.')
quotes <- data.frame(author, quote)
if(input$quoteSearch1!="" | input$quoteSearch2!=""){
words<-strsplit(input$quoteSearch1,input$quoteSearch2,",")
words<-as.character(words[[1]])
words<-tolower(words)
for(i in 1:length(words)){
quotes<-quotes[
grepl(words[i],quotes$quote),]
}
if (dim(quotes)[1]>0){
for(i in seq(from=1,to=dim(quotes)[1])){
outputed<-paste(outputed,
paste("Author: ",quotes[i,"author"]),
sep="<br/><br/>")
outputed<-paste(outputed,
highlight( paste("Quote: ",quotes[i,"quote"]), input$quoteSearch1, input$quoteSearch2),
sep="<br/><br/>")
}
} else {outputed- "No quotes found."}
}
HTML(outputed)
})
}
shinyApp(ui, server)
В идеальном случае пользователь будет выполнять поиск только с помощью ввода $ quoteSearch1, в отображаемых результатах не будет выделен первый пробел цитаты и отображаются только кавычки с искомым словом.
Любое понимание того, как написать мою функцию, чтобы она работала, даже если во входных данных нет текста $ quoteSearch2?