Shiny 入門筆記 1. First App

1. First Shiny App

1.2 構(gòu)造

1.2.1 UI

  • 用ui創(chuàng)建功能***Page()創(chuàng)建ui, 例如fluidPage(), fixedPage(), fillPage()
    or dashboardPage

1.2.2 Tags

用tags可以創(chuàng)建掛件?

ui <- fluidPage(
  titlePanel("Basic Demo"),
  h2("My favourite things"),
  tags$ul(tags$li("Coding"),
          tags$li("Cycling"),
          tags$li("Cooking")),
  p("This is a very basic demo."),
  tags$img(
    src = "https://debruine.github.io/shinyintro/images/logos/shinyintro.png",
    width = "100px",
    height = "100px"
  )
)

1.2.3 Page Layout

可以使用sidebarLayout()函數(shù)將元素排列成sidebarPanel()和mainPanel()兩個面板窄绒。如果瀏覽器寬度太窄跋核,則側(cè)邊欄將顯示在主面板的上方倦春。

ui <- fluidPage(titlePanel("Basic Demo"),
                sidebarLayout(sidebarPanel(
                  h2("My favourite things"),
                  tags$ul(tags$li("Coding"),
                          tags$li("Cycling"),
                          tags$li("Cooking"))
                ),
                mainPanel(
                  p("This is a very basic demo."),
                  tags$img(
                    src = "https://debruine.github.io/shinyintro/images/logos/shinyintro.png",
                    width = "100px",
                    height = "100px"
                  )
                )))

1.3 動態(tài)構(gòu)成

1.3.1 輸入

section 3 會細(xì)講

checkboxGroupInput(
  inputId = "fav_things",
  label = "What are your favourite things?",
  choices = c("Coding", "Cycling", "Cooking")
)

inputId, label 是二件套,一般都少不了

1.3.2 輸出

section 4 會細(xì)講

server會管理output, 包括表格誊薄,圖形,文字

1.3.3 動作按鈕

還可以添加執(zhí)行按鈕

ui <- fluidPage(
  titlePanel("This is a basic demo"),
  sidebarLayout(
    sidebarPanel(
      h2("Chapter 1"),
      tags$ul(
        tags$li("Car"),
        tags$li("Cooking"),
        tags$li("Coke")
      ),
      checkboxGroupInput(
        inputId = "fav_things",
        label = "What are your favourite things?",
        choices = c("Coding", "Cycling", "Cooking")
      ),
      actionButton(
        inputId = "count_fav_things",
        label = "Count",
        icon = icon("calculator")
      )
    ),
    mainPanel(
      p("This is a simple UI"),
      tags$img(
        src="<https://debruine.github.io/shinyintro/images/logos/shinyintro.png>",
        width="100px",
        height="100px"
      ),
      textOutput(outputId = "n_fav_things")
    )
  )
)

1.4 反應(yīng)式

反應(yīng)式函數(shù)是僅在特定類型的輸入更改時才運(yùn)行的函數(shù)拓挥。在server()函數(shù)內(nèi)撑瞧,輸入對象(input)是所有輸入值的命名列表碴萧。例如,如果想知道名為“fav_things”的選擇輸入中選擇了哪些項(xiàng)目末购,則應(yīng)使用input$fav_things破喻。

在這里,只想計算選中了多少個項(xiàng)目盟榴。希望每當(dāng)單擊“count_fav_things”按鈕時都執(zhí)行此操作曹质,因此我們可以使用反應(yīng)式函數(shù)observeEvent()來實(shí)現(xiàn)。每次inputcount_fav_things的值更改(即單擊它時)擎场,它將運(yùn)行括號{}內(nèi)的代碼羽德。代碼只會在inputcount_fav_things更改時運(yùn)行,而不是在函數(shù)內(nèi)的任何輸入更改時運(yùn)行迅办。

server <- function(input, output) {
  # count favourite things
  observeEvent(input$count_fav_things, {
    n <- length(input$fav_things)
    count_text <- sprintf("You have %d favourite things", n)
  })
}

現(xiàn)在我們想要在輸出“n_fav_things”中顯示這個文本玩般。我們需要使用與輸出函數(shù)配對的渲染函數(shù)。由于“n_fav_things”是使用textOutput()創(chuàng)建的礼饱,因此我們需要使用renderText()填充它。

server <- function(input, output) {
  # count favourite things
  observeEvent(input$count_fav_things, {
    n <- length(input$fav_things)
    count_text <- sprintf("You have %d favourite things", n)
        output$n_fav_things <- renderText(count_text)
  })
}

像編程中常見的一樣究驴,有許多方法可以實(shí)現(xiàn)相同的功能镊绪。這些方法有不同的優(yōu)缺點(diǎn),我們將在第5節(jié)中學(xué)到更多相關(guān)知識洒忧。這里提供另一種實(shí)現(xiàn)上述功能的代碼模式蝴韭。

server <- function(input, output) {
  # update count_text on fav_things
  count_text <- reactive({
    input$count_fav_things # just here to trigger the reactive
    fav_things <-
      isolate(input$fav_things) # don't trigger on checks
    n <- length(fav_things)
    sprintf("You have %d favourite things", n)
  })
  
  # display count_text when it updates
  output$n_fav_things <- renderText(count_text())
}

這個模式使用reactive()函數(shù)創(chuàng)建了一個名為count_text()的新函數(shù),該函數(shù)會在反應(yīng)式函數(shù)內(nèi)的任何輸入更改時更新其返回值熙侍。我們使用isolate()函數(shù)防止在用戶單擊復(fù)選框時count_text()函數(shù)發(fā)生變化榄鉴。

每當(dāng)count_text()函數(shù)返回的值發(fā)生更改時,這會觸發(fā)“n_fav_things”輸出的更新蛉抓。

這是第三種方法庆尘,使用eventReactive()函數(shù)避免了需要隔離inputfav_things,因?yàn)樗辉趇nputcount_fav_things發(fā)生更改時運(yùn)行巷送。

server <- function(input, output) {
  # update count_text on fav_things
  count_text <- eventReactive(input$count_fav_things, {
    fav_things <-input$fav_things
    n <- length(fav_things)
    sprintf("You have %d favourite things", n)
  })
  
  # display count_text when it updates
  output$n_fav_things <- renderText(count_text())
}

練習(xí)

用observeEvent, reactive, eventReactive寫反應(yīng)式

## ui  
ui <- fluidPage(titlePanel("Addition Demo"),
                sidebarLayout(
                  sidebarPanel(
                    numericInput("n1", "First number", 0),
                    numericInput("n2", "Second number", 0),
                    actionButton("add", "Add Numbers")
                  ),
                  mainPanel(textOutput(outputId = "n1_plus_n2"))
                ))

## Use observeEvent 
server <- function(input, output) {
    observeEvent(input$add,{
        sum<-input$n1+input$n2
        add_text<-sprintf("%d+%d=%d",input$n1,input$n2,sum)
        output$n1_plus_n2<-renderText(add_text)
    })
    
}

## Use reactive 
server <- function(input,output) {
    add_text<-reactive({
        input$add
        n1<-isolate(input$n1)
        n2<-isolate(input$n2)
        sprintf("%d+%d=%d",n1,n2,n1+n2)
    })
    
    output$n1_plus_n2<-renderText(add_text())
}

## Use eventReactive 
server<- function(input,output) {
    add_text<-eventReactive(input$add,{
        sprintf("%d+%d=%d",
                input$n1,
                input$n2,
                input$n1 + input$n2)
    })
    output$n1_plus_n2<-renderText(add_text())
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末驶忌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子笑跛,更是在濱河造成了極大的恐慌付魔,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件飞蹂,死亡現(xiàn)場離奇詭異几苍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)陈哑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進(jìn)店門妻坝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伸眶,“玉大人,你說我怎么就攤上這事惠勒∽眨” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵纠屋,是天一觀的道長涂臣。 經(jīng)常有香客問我,道長售担,這世上最難降的妖魔是什么赁遗? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮族铆,結(jié)果婚禮上岩四,老公的妹妹穿的比我還像新娘。我一直安慰自己哥攘,他們只是感情好剖煌,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著逝淹,像睡著了一般耕姊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上栅葡,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天茉兰,我揣著相機(jī)與錄音,去河邊找鬼欣簇。 笑死规脸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的熊咽。 我是一名探鬼主播莫鸭,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼横殴!你這毒婦竟也來了黔龟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤滥玷,失蹤者是張志新(化名)和其女友劉穎氏身,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惑畴,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛋欣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了如贷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陷虎。...
    茶點(diǎn)故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡到踏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出尚猿,到底是詐尸還是另有隱情窝稿,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布凿掂,位于F島的核電站伴榔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏庄萎。R本人自食惡果不足惜踪少,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望糠涛。 院中可真熱鬧援奢,春花似錦、人聲如沸忍捡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽砸脊。三九已至帆竹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間脓规,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工险领, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留侨舆,地道東北人。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓绢陌,卻偏偏與公主長得像挨下,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子脐湾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評論 2 345

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