ui 用戶自定義界面設(shè)置
server 服務(wù)端腳本
Shiny Text這個(gè)應(yīng)用程序展示的是直接打印R對象,以及用HTML表格展示數(shù)據(jù)框。要運(yùn)行例子程序,只需鍵入:
runExample("02_text")
前面那個(gè)例子里用一個(gè)滑動條來輸入數(shù)值,并且輸出圖形。而這個(gè)例子更進(jìn)了一步:有兩個(gè)輸入,以及兩種類型的文本輸出。
如果你改變觀測個(gè)數(shù), 將會發(fā)現(xiàn)Shiny應(yīng)用程序的一大特性:輸入和輸出是結(jié)合在一起的,并且“實(shí)時(shí)”更新運(yùn)算結(jié)果(就像Excel一樣)。 在這個(gè)例子中,當(dāng)觀測個(gè)數(shù)發(fā)生變化時(shí),只有表格更新,而不需要重新加載整個(gè)頁面。
下面是用戶界面定義的代碼。請注意,"sidebarPanel" 和 "mainPanel" 的函數(shù)調(diào)用中有兩個(gè)參數(shù)(對應(yīng)于兩個(gè)"輸入" 和 兩個(gè) "輸出").
ui.R
library(shiny)
# Define UI for dataset viewer app ----
ui <- fluidPage(
# App title app標(biāo)題 ----
titlePanel("Shiny Text"),
# Sidebar layout with a input and output definitions 帶有輸入和輸出定義的邊欄布局----
sidebarLayout(
# Sidebar panel for inputs 用于輸入的側(cè)欄面板----
sidebarPanel(
# Input: Selector for choosing dataset ----
selectInput(inputId = "dataset",
label = "Choose a dataset:",
choices = c("rock", "pressure", "cars")),
# Input: Numeric entry for number of obs to view ----
numericInput(inputId = "obs",
label = "Number of observations to view:",
value = 10)
),
# Main panel for displaying outputs ----
mainPanel(
# Output: Verbatim text for data summary ----
verbatimTextOutput("summary"),
# Output: HTML table with requested number of observations ----
tableOutput("view")
)
)
)
服務(wù)端的程序要稍微復(fù)雜一點(diǎn)?,F(xiàn)在,我們創(chuàng)建:
一個(gè)反應(yīng)性表達(dá)式來返回用戶選擇的相應(yīng)數(shù)據(jù)集。
還有兩個(gè)渲染表達(dá)式(rendering expressions,分別是renderPrint 和renderTable),以返回 output$summary 的 output$view 的值。
這些表達(dá)式和第一個(gè)例子中的 renderPlot 運(yùn)作方式類似:通過聲明渲染表達(dá)式,你也就告訴了shiny,一旦渲染表達(dá)式所依賴的值(在這里例子中是兩個(gè)用戶輸入值的任意一個(gè):input$dataset 或 input$n)發(fā)生改變,表達(dá)式就會執(zhí)行。。
# Define server logic to summarize and view selected dataset ----
server <- function(input, output) {
# Return the requested dataset ----
datasetInput <- reactive({
switch(input$dataset,
"rock" = rock,
"pressure" = pressure,
"cars" = cars)
})
# Generate a summary of the dataset ----
output$summary <- renderPrint({
dataset <- datasetInput()
summary(dataset)
})
# Show the first "n" observations ----
output$view <- renderTable({
head(datasetInput(), n = input$obs)
})
}
Create Shiny app ----
shinyApp(ui = ui, server = server)