像Scala Option / R中的可选项?

时间:2016-03-20 13:00:54

标签: r scala optional

R中是否有某种东西(包或基本习语)就像在Scala和其他语言中找到的选项一样(有关详细信息,请参阅标记可选)。具体来说,我正在寻找以下功能的一些对象:

  • 表示缺少值但很容易
  • 持有属性
  • 在没有包含值的情况下返回默认值,而不要求计算默认值的结果,除非实际需要

我确定选项中还有许多其他不错的特性,但我还没有完全认识到这些特点,因为我对这个成语比较新。任何能够提供超过上述功能的答案都会获得奖励积分,特别是如果可以很好地描述其他功能的话。

1 个答案:

答案 0 :(得分:0)

我尝试使用R6类(下面)编写一个糟糕的替代品。任何效果更好或与​​R更具惯用性的东西都将非常感激。

library(R6)
Option <- R6Class("Option", 
    public = list(
      initialize = function(value=NULL) {
        self$value <- value
      }
      ,get = function() {
        return(self$value)
      }
      ,set = function(value) {
        self$value <- value
        return(value)
      }
      ,getOrElse = function(...) {
        if(self$isDefined()) {
          return(self$value)
        } else {
          return(eval(...))
        }
      }
      ,isDefined = function() {
        return(!all(is.null(self$value)) && !all(is.na(self$value)))
      }
      , value = NULL
  )
  ,private = list()
  ,active = list()
) #end Option

示例:

bob <- Option$new()
bob$isDefined() == FALSE
bob$getOrElse("a") == "a"
bob$getOrElse({Sys.sleep(2);"b"})=="b"
bob$set(value = "a")
bob$isDefined() == TRUE
bob$getOrElse({Sys.sleep(2);"b"})=="a"