5.8 shiny中的整洁式编程
5.8.1 Data-masking
由于shiny通过input
来获取输入信息,其中不乏在数据框中需要用到的变量名。但由于不是直接输入对应的变量名,而是依靠input$variable
的形式调用,所以会出现意料之外的结果。对此,需要区分环境中的变量与数据框中的变量这两种变量。前者需要用.env$var
来声明,后者用.data$var
声明。
我们想根据输入的变量名及最小值来筛选数据。第一种写法就会出现意料之外的结果,第二种写法才符合预期。
# 第一种
data <- reactive(diamonds %>% filter(input$var > input$min))
# 第二种
data <- reactive(diamonds %>% filter(.data[[input$var]] > .env$input$min))
环境中有
input
,input
中有min
,故可写作.env$input$min
;数据框中没有input
,故.data$input$var
的写法错误