2017-07-21 4 views
0

Da diese Sprache ein Multiparadigma ist, frage ich mich, ob es einen Optionstyp in R (Some/None) gibt, nativ oder in einem Paket.Optionaler Typ in R-Sprache

Es wäre similar to F#, oder zu C# nullbaren.

Statt NULL zu verwenden, würden wir eine Art Wrapper haben:

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

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

Dann könnte man es auch herausfiltern:

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

Wenn es nicht vorhanden ist, hat jemand versucht, füge es ein?

+0

Meinten Sie wie S3 Methoden? – Suren

Antwort

0

Ich konnte keine Implementierung solcher (handlicher) Typen in R finden, also habe ich meins erstellt.

Ich hoffe, dass dies nicht als Werbung angesehen wird, weil ich denke, es ist ein sehr wichtiges Merkmal, das R fehlt, und für andere Leute, die diesen Gedanken teilen, kann dies nützlich sein.

UPDATE: Jetzt als Paket auf github und auf der CRAN.


Schnellstart:

Eine optionale Variable kann auf some(object) oder none eingestellt werden.

Operatoren und Druck haben dasselbe Verhalten mit einem optionalen als mit seinem Basistyp.

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

Beachten Sie, dass some(some(obj)) gleich some(obj) und dass some(none) gleich FALSE.


Um eine bestehende Funktion übernimmt optionals als Argumente zu machen und auch eine optionale Rück, kann man make_opt() verwenden:

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

Bonus Teil: I eingeführte Muster auch aus funktionalen Sprachen passend , mit match_with:

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

Dies soll mit Magrittr Paket verwendet werden, wenn Sie eine Syntax so nah wie die funktionelle match with erhalten möchten:

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