2017-07-21 6 views
0

Ce langage étant multi-paradigme, je me demande s'il existe un type Option dans R (Some/None), nativement ou dans un package.Type optionnel en langage R

Ce serait similar to F#, ou à des valeurs nulles C#.

Ainsi, au lieu d'utiliser NULL, nous aurions un emballage de type:

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

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

Ensuite, vous pouvez également filtrer sur:

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

Si elle n'existe pas, tout le monde a fait essayé de Mettre en œuvre?

+0

Vouliez-vous dire que les méthodes S3? – Suren

Répondre

0

Je n'ai pas trouvé d'implémentation de ces types (pratiques) dans R, donc j'ai créé le mien. J'espère que cela ne sera pas considéré comme une publicité, parce que je pense sincèrement que c'est une caractéristique très importante qui manque à R, et pour d'autres personnes partageant cette pensée, cela peut être utile.

MISE À JOUR: maintenant disponible sous forme de package sur github et sur CRAN.


Quickstart:

Une variable en option peut être réglée sur some(object) ou none.

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

Les opérateurs et l'impression auront le même comportement avec une option qu'avec son type de base.

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

Notez que some(some(obj)) égal some(obj) et que some(none) égal FALSE.


Pour faire une fonction existante accepte optionals comme arguments et revenir aussi une option, on peut utiliser make_opt():

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

partie Bonus: Je forme également introduit correspondant de langages fonctionnels , avec match_with:

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

Ceci est destiné à être utilisé avec Magrittr package si vous souhaitez obtenir une syntaxe aussi proche que la match with fonctionnelle:

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