Shiny 入门笔记 1. First App
1. First Shiny App
1.2 构造
1.2.1 UI
- 用ui创建功能***Page()创建ui, 例如
fluidPage()
,fixedPage()
,fillPage()
ordashboardPage
1.2.2 Tags
用tags可以创建挂件?
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()函数将元素排列成sidebarPanel()和mainPanel()两个面板。如果浏览器宽度太窄,则侧边栏将显示在主面板的上方。
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 动态构成
1.3.1 输入
section 3 会细讲
checkboxGroupInput(
inputId = "fav_things",
label = "What are your favourite things?",
choices = c("Coding", "Cycling", "Cooking")
)
inputId, label 是二件套,一般都少不了
1.3.2 输出
section 4 会细讲
server会管理output, 包括表格,图形,文字
1.3.3 动作按钮
还可以添加执行按钮
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 反应式
反应式函数是仅在特定类型的输入更改时才运行的函数。在server()函数内,输入对象(input)是所有输入值的命名列表。例如,如果想知道名为“fav_things”的选择输入中选择了哪些项目,则应使用input$fav_things。
在这里,只想计算选中了多少个项目。希望每当单击“count_fav_things”按钮时都执行此操作,因此我们可以使用反应式函数observeEvent()来实现。每次inputcount_fav_things更改时运行,而不是在函数内的任何输入更改时运行。
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)
})
}
现在我们想要在输出“n_fav_things”中显示这个文本。我们需要使用与输出函数配对的渲染函数。由于“n_fav_things”是使用textOutput()创建的,因此我们需要使用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)
})
}
像编程中常见的一样,有许多方法可以实现相同的功能。这些方法有不同的优缺点,我们将在第5节中学到更多相关知识。这里提供另一种实现上述功能的代码模式。
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()函数创建了一个名为count_text()的新函数,该函数会在反应式函数内的任何输入更改时更新其返回值。我们使用isolate()函数防止在用户单击复选框时count_text()函数发生变化。
每当count_text()函数返回的值发生更改时,这会触发“n_fav_things”输出的更新。
这是第三种方法,使用eventReactive()函数避免了需要隔离inputcount_fav_things发生更改时运行。
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())
}
练习
用observeEvent, reactive, eventReactive写反应式
## 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())
}