shiny程序的数据按来源可分为服务器数据、外网数据和用户在线提供的数据等,它们可通过web或R函数获取。外网数据和服务器数据多以文件方式存在,状态相对稳定,属于静态数据,获取较简单。shiny主要关注用户数据的处理,提供了很多相关的函数。
1 静态数据处理
1.1 shiny程序的目录结构
先理解两个概念:当前R工作目录和shiny程序网站(网页)目录。以名称为 test 的shiny程序为例,它在shiny server上的目录结构可能是这样的:
/srv/shiny-server |--test |-- app.R
如果你在shiny程序中用getwd()获取信息,你得到的是 /srv/shiny-server/test,这就是shiny程序的当前R工作目录。
但是shiny程序网站目录却没有那么直观,在上面的目录结构中你甚至看不到:它是在test目录下名称为www的子目录。为什么?没有为什么,shiny开发者这么设置的。不管你有没有设置www子目录,它shiny程序运行时都存在。所以,上面程序的目录结构实际上是这样的:
/srv/shiny-server |--test |-- www |-- app.R
www子目录是shiny程序HTTP服务运行的根目录,该目录以外的东西对web用户不可见。
1.2 使用R语句读写服务器文件
如果权限合适,R语句可以读取、重写、删除服务器上任何地方的文件,这跟控制台运行R语句没什么两样。这是shiny网络应用的一个巨大安全隐患,请不要设计这样的程序,否则对服务器可能造成灾难。服务器的维护者应认真采取措施,防范网络用户通过shiny客户端注入写盘代码。
理论上,你可以在任何有权限的地方放置你的数据文件,比如你的home目录。但考虑安全和shiny程序封装性,一般是在shiny程序目录下单独建立一个专门存放数据的目录,如data。
1.3 通过HTML代码引入服务器文件
如果在shiny的ui中使用link或script标签引用css或js文件,必须使用程序网站的相对路径。由于网站根目录是www,我们不能把文件放在www目录以外的其他地方(可以是www的子目录)。如果一个shiny程序test的目录结构是这样的:
/srv/shiny-server |--test |-- www |-- style1.css |-- styles |-- style2.css |-- media |-- style3.css |-- app.R
style1.css 和 style2.css 都可通过html代码引入,而 style3.css 将无法使用。ui中 style1.css 和 style2.css 的使用方式可以这样:
tags$style(rel='stylesheet' href='style1.css') tags$style(rel='stylesheet' href='styles/style2.css')
需要使用相对路径进行引用。
2 用户数据处理
2.1 UI控件函数
在HTML页面中,用户通过输入框、选框和按钮等方式提供数据。shiny程序也一样,只不过shiny把一些特定类型的输入做成了控件函数的形式: