在Shiny中使用IF创建函数

时间:2018-12-21 12:17:19

标签: r shiny

我具有一个功能,该功能突出显示引号中的文本,该引号与用户在两个textInput小部件中输入的内容相对应。 如果第二个textInput字段中没有输入文本,则返回的结果将突出显示第一个空格,这是不希望的。

我试图在函数中使用if else语句,但没有成功。

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)

理想的情况是,如果用户仅从input $ quoteSearch1搜索,显示的结果将不会突出显示引号的第一行,而仅显示带有搜索词的引号。

即使在input $ quoteSearch2中没有文本的情况下,如何编写函数以使其正常工作的任何见解?

1 个答案:

答案 0 :(得分:1)

我认为如果包含空字符串,您可以简单地用NA覆盖search2

highlight <- function(text, search1, search2) {
  if (search2 == "") search2 <- NA

  x <- unlist(strsplit(text, split = " ", fixed = T))
  x[tolower(x) %in% tolower(c(search1, search2))] <-
    paste0("_", x[tolower(x) %in% tolower(c(search1, search2))], "_")

  paste(x, collapse = " ")
}

请注意,我在所选单词上加了下划线,以检查该功能是否有效。当然,您可以将其更改为自己喜欢的任何内容。

> highlight("I like cats", "cats", "")
[1] "I like _cats_"