什么是shiny?Shiny是一个R包,可让您轻松地直接从 R 构建交互式 Web 应用程序(应用程序)。本系列是个长教程,带你由浅入深学习shiny。
上一节我们在文章《R语言系列教程—–一起来学shiny吧(3)》中,介绍怎么在shiny中添加控件,进行人机交互。这回我们介绍一下怎么对控件进行界面输出。
输出部分主要是通过output进行输出,output 很类似于input 它也是一个根据输出标识命名的列表类对象。主要的区别是,您使用它来发送输出,而不是接收输入。shiny中,我们这样输出是错误的,
” Can’t modify read-only reactive value ‘count’“。因为输出这部分由output处理,定义input$count <- 10 会让函数以为你要重新定义count。
library(shiny)
## Warning: 程辑包'shiny'是用R版本4.2.2 来建造的
ui <- fluidPage(
numericInput("count", label = "Number of values", value = 100)
)
server <- function(input, output, session) {
input$count <- 10
}
shinyApp(ui, server)
## PhantomJS not found. You can install it with webshot::install_phantomjs(). If it is installed, please make sure the phantomjs executable can be found via the PATH variable.
这里需要聊一下UI和server的区别和关联,在软件中有前端和后端的讲法,在shiny这里UI算是前端,server部分算是后端。UI在这里前端有分输入和输出部分。前端主要是设计软件的界面,输入和输出。后端对前端的输入部的内容,通过代码进行运算,绘图。得出结果后然后在发给前端的输出部分。最后显示到软件上面。我简单画了个思维导图
因此我们需要明白,我们在控制输入和输出部分都应该是前端,后端只是帮我们运行计算,就像一个默默的无名英雄,它是我们装载内容的容器。 我们先来看下面这段代码,我们在UI也就是前端定义了textOutput输出”greeting”这个变量,后端中output$greeting 是定义了greeting 是什么,是Hello human!这个字符。比喻一下,前端就像个电视,它定义你按了哪个频道,哪个频道输出内容,但是频道具体内容它不管,由后端也就是电视数据线输出,当然也就是电视台服务器输出。
ui <- fluidPage(
textOutput("greeting")
)
server <- function(input, output, session) {
output$greeting <- renderText("Hello human!")
}
shinyApp(ui, server)
在上个例子中,我们可以发现server (后端)只是对前端UI定义的输出的内容直接定义了,并没有读取前端输入的内容,下面我们再来看一个例子,在这个例子中,前端UI显示定义了”name”这个输入变量,然后又定义了”greeting”这个输出变量。我们来看下后端server 是怎么处理这个输入和输出的output g r e e t i n g 这个就相当于提取了定义的 " g r e e t i n g " , i n p u t greeting这个就相当于提取了定义的"greeting",input greeting这个就相当于提取了定义的"greeting",inputname这里等于提取了”name”这里的内容,用过renderText({ paste0(“Hello”, input$name, “!”)})把输入和输出进行了关联。
ui <- fluidPage(
textInput("name", "What's your name?"),
textOutput("greeting")
)
server <- function(input, output, session) {
output$greeting <- renderText({
paste0("Hello ", input$name, "!")
})
}
shinyApp(ui, server)
回到开头的第一个例子,这就很清楚啦,这里定义了输入,没有定义输出,
我们对它修改一下,增加一个输出选项num,然后使用renderText读入选项,
ui <- fluidPage(
numericInput("count", label = "Number of values", value = 100),
textOutput("num")
)
server <- function(input, output, session) {
output$num <- renderText(input$count)
}
shinyApp(ui, server)