R Shiny 添加用戶反饋功能

本章節(jié)主要內(nèi)容是如何實(shí)現(xiàn)包括確認(rèn),取消在內(nèi)的用戶反饋操作锐想。

內(nèi)容流程是先介紹validation,用來(lái)讓用戶確認(rèn)自己的輸入。然后是介紹注意 notification ,用來(lái)編輯注意??警告文该编。然后是progress bars ,這個(gè)是用來(lái)展示進(jìn)度還有時(shí)間耗費(fèi)硕淑。最后會(huì)介紹confirmationundo 的操作课竣,用來(lái)確認(rèn)和取消操作嘉赎。

本章節(jié)主要是用shinyFeedback 包來(lái)實(shí)現(xiàn)以上的操作。

1 Validation驗(yàn)證

1.1 驗(yàn)證輸入Input

具體操作大概分成兩步于樟。2 steps.

首先要在ui里加入useShinyFeedback() 公条。這一步的作用是自動(dòng)設(shè)置需要的HTML和JAVA腳本。

ui <- fluidPage(
  shinyFeedback::useShinyFeedback(),
  numericInput("n", "n", value = 10),
  textOutput("half")
)

然后需要在server端設(shè)置反饋信息迂曲。種類分成feedback, feedbackWarning, feedbackDanger, feedbackSuccess靶橱。不管是哪一種包含三個(gè)參數(shù)信息。

  • inputId: feedback對(duì)象的ID
  • show:有關(guān)是否要展示feedback信息的一個(gè)邏輯變量
  • text: 需要展示的feedback信息

還有coloricon 參數(shù)可以設(shè)置路捧,詳細(xì)信息可以參考幫助文件关霸。

server <- function(input, output, session) {
  half <- reactive({
    even <- input$n %% 2 == 0
    # inputID= "n" 
    # show= !even
    # text= "Please select an even number"
    shinyFeedback::feedbackWarning("n", !even, "Please select an even number")
    input$n / 2    
  })
  
  output$half <- renderText(half())
}

shinyApp(ui, server)

上面的代碼雖然成功顯示了警告文,但還是運(yùn)行了代碼給出了結(jié)果杰扫。理想的情況是不運(yùn)行谒拴。可以用到之前提過(guò)的req() 函數(shù)涉波。 之前文章里沒(méi)有說(shuō)明這是什么函數(shù)英上,其實(shí)是”require”的縮寫(xiě)。

server <- function(input, output, session) {
  half <- reactive({
    even <- input$n %% 2 == 0
    shinyFeedback::feedbackWarning("n", !even, "Please select an even number")
    req(even)
    input$n / 2    
  })
  
  output$half <- renderText(half())
}

1.2 用req()取消代碼執(zhí)行

如果想實(shí)現(xiàn)在沒(méi)有任何操作的情況下不顯示任何信息啤覆,可以用req()函數(shù)苍日。

通常在下面的三個(gè)情況下可能會(huì)用到

  • textInput(), 設(shè)置默認(rèn)輸入是value=””,這個(gè)時(shí)候不會(huì)在有輸入前跳出任何信息
  • selectInput()窗声,可以創(chuàng)建一個(gè)空白選項(xiàng)
  • fileInput() 相恃,在有輸入之前就是一個(gè)空白項(xiàng)

舉個(gè)例子,如果不用req() 就會(huì)顯示錯(cuò)誤信息笨觅,雖然不會(huì)影響整體拦耐,但是不美觀。

ui <- fluidPage(
  selectInput("language", "Language", choices = c("", "English", "Maori")),
  textInput("name", "Name"),
  textOutput("greeting")
)

server <- function(input, output, session) {
  greetings <- c(
    English = "Hello", 
    Maori = "Kia ora"
  )
  output$greeting <- renderText({
    paste0(greetings[[input$language]], " ", input$name, " !")
  })
}

加入req() 以后就可以解決见剩。 不符合邏輯要求的話所有下游的計(jì)算都會(huì)被取消杀糯。

server <- function(input, output, session) {
  greetings <- c(
    English = "Hello", 
    Maori = "Kia ora"
  )
  output$greeting <- renderText({
    req(input$language, input$name)
    paste0(greetings[[input$language]], " ", input$name, "!")
  })
}

req() 有好幾種用法,一種就是剛才的req(input$x) 苍苞,只有指定數(shù)值以后才執(zhí)行接下來(lái)的代碼固翰。還有一種是req(input$a > 0) 添加邏輯判斷函數(shù)。

1.3 req()和驗(yàn)證

結(jié)合req() 和驗(yàn)證可以實(shí)現(xiàn)比較復(fù)雜的功能羹呵。比方說(shuō)在輸入錯(cuò)誤的時(shí)候不要顯示空白骂际,而是把結(jié)果顯示停留在之前的結(jié)果上「曰叮可以用到exists 函數(shù)來(lái)根據(jù)數(shù)據(jù)集是否存在的邏輯結(jié)果來(lái)激活feedbackDanger歉铝,流程歸納一下就是如下:

輸入datasets名字,req() 確認(rèn)到輸入以后執(zhí)行操作凑耻,確認(rèn)datasets名字存在太示,不存在的話發(fā)出警告文柠贤,并且cancel output。讓結(jié)果停留在之前先匪。

ui <- fluidPage(
  shinyFeedback::useShinyFeedback(),
  textInput("dataset", "Dataset name"), 
  tableOutput("data")
)
server <- function(input, output, session) {
  data <- reactive({
    req(input$dataset)
    exists <- exists(input$dataset, "package:datasets")
    shinyFeedback::feedbackDanger("dataset", !exists, "Unknown dataset")
    req(exists, cancelOutput = TRUE)

    get(input$dataset, "package:datasets")
  })
  
  output$data <- renderTable({
    head(data())
  })
}

get() 函數(shù)https://rdrr.io/r/base/get.html

1.4 Validate輸出

盡管之前介紹的shinyFeedback看上去很有用种吸,但是在面對(duì)多個(gè)錯(cuò)誤的復(fù)雜條件的情況下也會(huì)顯得無(wú)能為力,這時(shí)候就要用到validate()函數(shù)了呀非。

舉個(gè)例子坚俗,我們需要計(jì)算一個(gè)輸入值的平方,對(duì)數(shù)岸裙,開(kāi)根號(hào)值猖败。需要對(duì)數(shù)和開(kāi)根號(hào)計(jì)算時(shí)對(duì)于小于0的輸入值報(bào)錯(cuò)。

注意一下switch的用法降允。

ui <- fluidPage(
  numericInput("x", "x", value = 0),
  selectInput("trans", "transformation", 
    choices = c("square", "log", "square-root")
  ),
  textOutput("out")
)

server <- function(input, output, session) {
  output$out <- renderText({
    if (input$x < 0 && input$trans %in% c("log", "square-root")) {
      validate("x can not be negative for this transformation")
    }
    
    switch(input$trans,
      square = input$x ^ 2,
      "square-root" = sqrt(input$x),
      log = log(input$x)
    )
  })
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末恩闻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子剧董,更是在濱河造成了極大的恐慌幢尚,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翅楼,死亡現(xiàn)場(chǎng)離奇詭異尉剩,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)毅臊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)理茎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人管嬉,你說(shuō)我怎么就攤上這事皂林。” “怎么了蚯撩?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵础倍,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我求厕,道長(zhǎng)著隆,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任呀癣,我火速辦了婚禮,結(jié)果婚禮上弦赖,老公的妹妹穿的比我還像新娘项栏。我一直安慰自己,他們只是感情好蹬竖,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布沼沈。 她就那樣靜靜地躺著流酬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪列另。 梳的紋絲不亂的頭發(fā)上芽腾,一...
    開(kāi)封第一講書(shū)人閱讀 48,954評(píng)論 1 283
  • 那天,我揣著相機(jī)與錄音页衙,去河邊找鬼摊滔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛店乐,可吹牛的內(nèi)容都是我干的艰躺。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼眨八,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼腺兴!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起廉侧,我...
    開(kāi)封第一講書(shū)人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤页响,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后段誊,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體闰蚕,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年枕扫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了陪腌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡烟瞧,死狀恐怖诗鸭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情参滴,我是刑警寧澤强岸,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站砾赔,受9級(jí)特大地震影響蝌箍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜暴心,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一妓盲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧专普,春花似錦悯衬、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)策橘。三九已至,卻和暖如春娜亿,著一層夾襖步出監(jiān)牢的瞬間丽已,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工买决, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沛婴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓策州,卻偏偏與公主長(zhǎng)得像瘸味,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子够挂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容