2017-07-21 69 views
0

這種語言是多範式的,我想知道R(Some/None)中是否存在Option類型,本地或包中。R語言中的可選類型

這將是similar to F#,或C#可空。的

因此而不是使用NULL,我們將有一個類型的包裝:

square <- function(x) { 
    if (class(x) == "numeric") 
    return(Some(x*x)) 
    else 
    return(None) 
} 

square(2) 
> 4 
square("foo") 
> None 

然後,你還可以過濾出來:

if (square(x) == Some(4)) 
    print(x) 

如果它不存在,沒有人試圖執行它?

+0

你的意思是像S3的方法呢? – Suren

回答

0

我在R中找不到這種(方便)類型的實現,所以我創建了我的。

我希望這不會被視爲一個廣告,因爲我認爲這是R缺乏的一個非常重要的特徵,對於其他人共享這個想法,這可能是有用的。

更新:現在可作爲githubCRAN的包裝提供。


快速入門:

一個可選變量可以被設置爲some(object)none

a <- some(5) 
class(a) 
## [1] "optional" 

運算符和打印將具有與其基本類型相同的可選行爲。

a == 5 
## [1] TRUE 
a 
## [1] 5 

注意some(some(obj))等於some(obj)some(none)等於FALSE


爲了使現有的功能接受自選作爲參數,並返回一個可選的,可以使用make_opt()

c_opt <- make_opt(c) 
c_opt(some(2), none, some(5)) 
## [1] 2 5 
c_opt() 
## [1] "None" 

獎金部分:我還介紹了模式函數式語言匹配,與match_with

match_with(variable, 
pattern , result-function, 
... 

這是爲了與Magrittr包一起使用,如果你想獲得儘可能接近的功能match with語法:

a <- 5 
match_with(a, 
    . %>% some(.),   print, 
    none,     function() print("Error!") 
)