1

我正在尝试使用我同事创建的一些功能创建一个闪亮的应用程序。他经常在他的函数中使用“<<-”运算符来创建全局对象。

问题: 1. 在这种情况下使用 <<- 是一个好习惯吗?2. 如果我使用reactive() 来表示对象,应用程序会更快吗?3. 有更好的建议吗?

这是他编写的函数的示例:

PrepareData<-function(pickoneperday=TRUE,data) { 
  set.seed(1)
  if (pickoneperday==TRUE) {data <<- PickOnePerDay(data)} 
  data <<- RankData(data)
  SetMeasureType()
  minnodebase <<- 0.005*nrow(data)
  CodeMissingData(data)
}
4

1 回答 1

2

首先,我认为我们需要澄清问题的范围。

  1. 如果您在 R 中编写函数,为清楚起见,最好在函数末尾使用返回值return(),或者至少将数据对象放在大括号之前的最后。在这种情况下,使用<<-可能会产生任何类型的错误和并发症(简而言之,这是对意大利面条式编程的提醒,打破了对相关函数只有一个退出点的规则)。
  2. shiny特殊功能的情况不同。我只是想提醒一下,shiny编码人员通常不会return()在闪亮功能的末尾使用(即使它仍然可以工作)。这里要么没有返回值,要么reactive使用了或其他类似的构造。

部分混淆来自问题中的最小示例:示例不是shiny特殊函数,而只是普通函数。

shiny中,例如使用类似的构造observe,它可能碰巧用于<<-更新全局对象。一个很好的例子(我经常回顾的一段很棒的代码)是由闪亮的开发人员之一 Jeff Allen 开发的应用程序 ShinyChat -请参见 github 上的此处。在这种情况下,Jeff 使用 <<-observe函数内部更新在全局级别定义的 reactiveValue:非常好的风格。

我用一个小点来结束:如果你有任何函数并且你用 更新了一个变量 <<-,并且你在本地定义了一个同名的变量,那么只有全局变量被更新。在这些情况下,您需要执行类似的操作

data <<- data <- 3

从右到左:第一个<-更新了局部变量name data:第二个<<-更新了全局变量named data。谈论混乱。

另一方面,在闪亮的或标准的 RI 中,从来没有因为<<-.

关于类似reactiveor的替代技术问题reactiveValues,请在此处查看关于 SO 的类似问题的良好答案。

于 2017-08-29T22:11:00.873 回答