-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathR.language.txt
1841 lines (1646 loc) · 127 KB
/
R.language.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
┏━━━━━━━━━━━━━━━━┓
┃ R_SYNTHESE ┃
┗━━━━━━━━━━━━━━━━┛
┌─────────────┐
│ GENERAL │
└─────────────┘
VERSION ==> #2.15
help(COMMAND)
?COMMAND #Commande d'aide
help.search(REGEX)
??REGEX #Recherche de commandes
example(COMMAND) #Lance des commande montrant par l'example le fonctionnement de COMMAND
REGEXP ==> #Regexps étendus ("limit-class"). Pas de globbing.
#Perl regexp avec argument "perl" parfois. Alors, faire un double échappement.
# - seulement \w, \s, \d (dont majuscules)
SHORTCUTS ==> #Look at /etc/inputrc
┌─────────────┐
│ SYNTAXE │
└─────────────┘
#COMMENT #Commentaires sontt jetés dès que possible et impossibles à capturer dans un language object.
#line NUM [FILE] #Preprocessing directive, comme en C, peu utile pour l'user
SYNTAXE ==> #R est case sensitive
#Les espaces (ou leur absence) n'ont pas d'importance
#On peut clore ligne par newline ou un ; comme en Bash.
VARIABLES ==> #Object-oriented, les variables sont appelées "objets"
VAL #Si seul sur la ligne de commande, imprime vers stdout (/dev/null si non-interactive)
VAR #Expand valeur de VAR
`VAR` #` est utilisé pour quote un NAME (VAR).
#On peut utiliser tout caractère spécial (dont " ' Unicode, control chars, mais sauf `) comme nom de
#variable, en utilisant cette syntaxe.
#Cependant, pour être portable, utiliser seulement [[:alnum:]._], avec _ jamais au début, et .
#jamais suivi d'un [:digit:] si au début.
VAR = VAL #Assigne VAR pour l'ENVIRONMENT courant
VAR <- VAL #Préférer <-, car = ne peut pas être utilisé partout.
VAL -> VAR #Renvoie VAL, donc multiple assignement possible : VAR1 <- VAR2 <- VAL
VAR <<- VAL #Comme assign() avec inherits=TRUE, sauf qu'en plus n'utilise pas l'ENVIRONMENT courant. Donc :
VAL ->> VAR # - assigne le VAR de l'ENVIRONMENT le plus enfant parmi les parents.
# - si aucun ENVIRONMENT parent ne contient VAR, désigne alors .GlobalEnv
EXPR #Désigne un statement (un CALL). Peut être simple ou compound.
{ EXPR... } #Il s'agit d'une compound EXPR. Evalue EXPR... et renvoie la dernière EXPR (return value)
#Ex.: { 1+1;2+2 } * 3
#Utilisé par les structures function(), if, etc.
VISIBILITY ==> #Il s'agit du fait qu'un EXPR soit imprimée en console ou non si top-level EXPR.
#Une visible EXPR "top-level" (compound, ou simple mais isolée) sera imprimée via print() après
#évaluation dans une console.
#Même invisible, elle reste utilisable en arg d'une autre fonction, dont assignement.
#La visibilité d'une compound EXPR est celle de sa return value.
( EXPR ) #Equivaut à EXPR, sauf que visibilité est toujours activée.
#Ex: (VAR <- VAL)
invisible(EXPR) #Equivaut à EXPR, sauf que visibilité n'est jamais activée.
withVisible(EXPR) #Renvoie une LIST où $value est évaluation d'EXPR (sauf si LANGUAGE object, cad eval(enquote(EXPR)))
#et $visible est TRUE ou FALSE selon visibility.
if ( BOOL )
EXPR else EXPR2 #else doit être sur la même ligne que dernière EXPR ou } si bloc.
ifelse(BOOLv,VALv,VAL2v)#Version vectorisée : chaque élément du VALv renvoyé dépend de chaque élément de BOOLv
for ( VAR in VALv ) EXPR
repeat EXPR #while true
while ( BOOL ) EXPR
break #Arrête une loop for, repeat ou while.
next #Lance la prochaine loop en sautant l'actuelle.
switch(VAL[=DEFAULT], #VAL peut être :
[NAME=]EXPR...) # - UINT, auquel cas l'EXPR numéro UINT est évaluée
# - STR, auquel cas l'EXPR dont le NAME (sans quote) == STR est évaluée.
# Si STR == aucun NAME, évalue l'unnamed EXPR s'il y en a un et un seul (sert à définir un défault).
# EXPR peut être omis, auquel cas, c'est le prochain EXPR qui est évalué (sert à définir plusieurs
# NAME pour un seul EXPR
#Sinon n'évalue rien, mais pas d'erreur.
┌─────────────┐
│ CONSOLE │
└─────────────┘
INITIALISATION FILES ==>#Dans l'ordre :
# - R_PROFILE (R-env. var) : si unset, R_HOME/etc/Rprofile.site
# - ./.Rprofile
# - si absent, ~/.Rprofile
# - si R_PROFILE_USER (R-env. var) est set, utilise R_PROFILE_USER au lieu de ces derniers
R_HOME #Signifie /usr/lib/R/
R_HOME/etc/ #Fichiers conf de R (Bash), pointant vers /etc/ :
# - Renviron : environment variables lors du lancement de R (mettre NULL, sans guillemets, pour une
# VAR vide)
# - Makeconf : compil flags lors d'installation+compilation de packages
# - repositories : repos lors d'installation de packages
OPTIONS ==> #Pseudo-environment variables associées à un package donné.
options() #Montre ensemble des options variables.
options(VAR=VAL) #Initialise/set une option variable.
getOption(STR|default) #Renvoie valeur d'option variable STR. Renvoie default (déf: NULL) si STR n'existe pas.
R.home(|component) #Renvoie emplacement selon component :
# - "home" (déf) : ex: /usr/lib/R
# - peut aussi utilisant commande R RHOME
# - "bin" : ex: /usr/lib/R/bin/
# - "modules" : ex: /usr/lib/R/modules/
# - "share" : ex: /usr/share/R/
interactive() #Renvoie TRUE si console intéractive.
HISTORY ==> #Touches haut et bas.
#Sauvé dans un fichier nommé .Rhistory dans le répertoire courant.
#Les sessions sont donc liées à un répertoire donné.
#r-environment variables :
# - R_HISTFILE (déf: ".Rhistory")
# - R_HISTSIZE (déf: 512)
.Last.value #Dernière valeure imprimée ou assignée.
[load|save]history
(|file) # - file (déf: "./R_HISTFILE")
history(|max.show, #Imprime historique.
reverse,pattern,...) # - max.show (déf: 25)
# - reverse (déf: FALSE)
# - pattern (déf: NULL) : n'imprime que les lignes matchant pattern. ... sont args pour grep.
timestamp() #Imprime time courant, et le met dans l'historique
.First
.Last #Définir ces fonctions fait qu'elles sont exécutées au début et fin d'une session
RDA FILE ==> #Fichier binaire contenant un ensemble de variables. .RData est en fait un .rda file.
#Fichier binaire (bytecode), ensuit gzippé.
load(FILE|envir) #Charge un fichier .rda.
save(...|list,file, #Sauvegarde des vars sous un fichier .rda.
ascii,version,envir, # - ... et list (déf: rien) : vars à sauvegarder
compress, # - file (pas de déf) : fichier à créer
compression_level) # - ascii (déf: FALSE) : sauvegarde sous un format bizarre, mais non-binaire (me semble inutile)
# - version (déf: 2)
# - compress (déf: !ascii) STR (déf: "gzip") : parmi "gzip", "bzip2", "xz". TRUE équivaut à "gzip"
# - compression_level (déf: 6 pour gzip et 9 pour xz et bzip2)
save.image() #Equivaut à save(list=ls(all=TRUE),file=".RData"). (invoqué lors d'un quit())
RDS FILE ==> #Comme .rda, mais pour une seule variable. Sert donc à sérialiser.
saveRDS(object|file,
ascii,version,compress) #Comme save(), mais pour un .rds
readRDS(file)
[un]serialize(...) #Semble pareil, sans l'arg. ascii et file ne peut pas être une STR.
RDB ET RDX FILES ==> #Utilisé par un package.
#Contient variables du package : .rdb est database (compressée), .rdx index de la database.
#Loaded par lazyLoad(), mais lui-même appelé par d'autres fonctions de plus haut niveau lors du load
#du package.
edit(VAR|file, #Edite l'objet via le programme editor (déf: option "editor") et renvoire l'objet modifié.
editor,...) #Si file (déf: ""), crée aussi un fichier avec l'objet. ... est passé à editor.
#Des versions pour un editor donné existent aussi : vi(), emacs(), pico(), xemacs(), xedit()
#La fonction data.entry() est un editeur GUI pas terrible.
fix(VAR) #Equivaut à VAL <- edit(VAR)
proc.time() #Imprime temps écoulé de la session
system.time(EXPRESSION) #Benchmark timing
sessionInfo() #Donne plusieurs infos sur la session courant (R version,plateforme,locales,packages)
┌─────────────────┐
│ BASIC TYPES │
└─────────────────┘
DYNAMIC TYPING ==> #Lors de VAR <- VAL, VAL est transtypé vers le type qu'elle semble indiquer.
#FUNC(VAL) ne modifie pas le type, car functions sont génériques, sauf functions builtins qui
#transtype alors VAL vers un builtin type, par exemple VAL + VAL2.
DATA TYPES ==> #Le type de base est un vector VALv pour les types les plus courants : NUM, STR, RAW, LIST, LANGUAGE,
#EXPRESSION.
#Tout VAL scalaire est alors en fait un VALv d'un seul élément.
#Les opérations sont en général effectués sur chaque élément :
# - deux vecteurs de tailles différentes peuvent opérer ensemble. Alors, le plus court se répète
# alors (notamment vecteur de taille 1)
#Le "type" désigne le type sous-jacent.
#Tous les éléments du vecteur doivent avoir le même type primitif.
#Types primitifs :
# - "character" : STR ou CHAR, notés "STR" (préférer) ou 'STR' (déf: "")
# - "double" : DOUBLE, la plupart des nombres natifs, même entiers, sont interprétés en double
# - Formats possibles :
# - 1, 1.1, 1e10, -1
# - 0xf0
# - "integer" : INT[L]
# - "complex" : COMPLEX, noté [NUM±]NUMi (déf: 0+0i)
# - "logical" : BOOL_VAL, noté TRUE ou FALSE (déf: FALSE)
# - T et F sont aussi possibles comme raccourcis, mais sont des variables, donc overwritables par
# le client: utiliser donc TRUE et FALSE
# - NA peut être utilisée comme "indeterminate" en logique tribooléenne
# - "raw" : VOID_ADR, octet, noté 00 ou f8, etc. (déf: 00). Un vecteur donne un flux d'octets.
# - NULL
# - "list" et "pairlist"
# - "expression", "language", "symbol"
# - "closure", "builtin", "special"
# - "S4" : semble être des définitions de classes S4
# - "environment"
# - "bytecode" : un pointeur vers du bytecode
# - d'autres rarement utilisés : "promise", "externalptr", "weakref"
# - utilisés qu'en interne : "...", "char"
# - "any" : tout type
# - en fait pas un type, mais simplement de la convention des arguments mode ou type, qui peuvent
# prendre comme valeur "any", signifiant "tout type"
#Une variable change de type (weak typing) lorsqu'on lui assigne une valeur de type différent.
#Le "mode" est un "surtype", plus commode que le type interne renvoyé par typeof :
# - "numeric" : NUM, "integer" ou "double"
# - "function" : "closure", "builtin" et "special"
# - "name" : "symbol"
# - autres : pareil
TYPE( INT ) #Renvoie un vecteur de NUM TYPE, initialisés à leur valeur par défaut.
#INT est par défaut 0, donc vecteur vide.
#Ne marche que pour "character", "double", "integer", "complex", "logical", "raw"
as.TYPE( VAL ) #Transtypage :
# - vers STR : 3 -> "3", 1+3i -> "1+3i", TRUE -> "TRUE"
# - vers NUM :
# - TRUE -> 1, FALSE -> 0,
# - "Hello" -> NA, "3.1" -> 3.1, 1+3i -> 1 (erreur)
# - vers COMPLEX : comme NUM, mais +0i
# - vers LOGICAL :
# - "TRUE" -> TRUE, "Hello" -> NA
# - != 0 -> TRUE, 0 -> FALSE
#Le transtypage ("coercion") peut être implicite (arguments d'un autre type sont implicitement
#transtypés)
#Dans un code, si transtypage possible, faire if (!is.TYPE(VAL)) VAL <- as.TYPE(VAL)
is.TYPE( VAL ) #
typeof( VAL ) #Attribut interne type de VAL, sous forme de STR.
mode( VAL ) #Attribut interne mode de VAL.
storage.mode( VAL ) #Attribut interne storage.mode de VAL
object.size(VAR) #Imprime taille occupée par un objet.
OPÉRATIONS AVEC TYPE # - NUM et COMPLEX :
NATIFS ==> # - + - * / ( )
# - ^ **
# - identiques (préférer ^)
# - %% %/%
# - %% est modulo
# - %/% est le quotient entier : as.integer(x/y)
# - > >= < <= == !=
# - BOOL_VAL et RAW (bitwise) :
# - > >= < <= == !=
# - & && | || ! xor()
# - && et || :
# - compare des BOOL et renvoient un BOOL
# - n'évalue pas le reste de chaîne si début est FALSE (pour &&) ou TRUE (pour ||)
# - ex: TRUE || { EXPR ; BOOL } n'évalue pas EXPR
# - les autres, dont & et | :
# - compare des BOOLv et renvoient un BOOLv
# - STR :
# - > >= < <= == !=
identical(BOOL1,BOOL2) #Renvoie TRUE si BOOL1 = BOOL2 est un ensemble de TRUE, et que BOOL1 et BOOL2 ont même taille.
isTRUE(BOOL) #Same as identical(BOOL,TRUE)
any(BOOLv) #Renvoie TRUE si BOOLv contient au moins un TRUE.
all(BOOLv) #Renvoie TRUE si BOOLv ne contient que des TRUE.
VECTEUR VIDE ==> #Un vecteur peut ne pas avoir d'élément, mais il conserve un type : character(0), numeric(0), etc.
# - "" n'est pas character(0), car il y a un élément : ""
# - NULL n'est pas *tout* vecteur vide, mais un vecteur vide de type NULL :
# - NULL est toujours de longueur 0
# - NA est une constante spéciale, de tout type NUM ou STR, comptant pour un élément :
# - en fait englobe cinq sous-constantes pour chaque type : NA_integer_, NA_real_, NA_complex_
# NA_character_ et NA (logical). NA est coercibles vers les autres.
# - indique une valeur absente
# - sens possibles :
# - Valeur absente/non recueillie d'un sample
# - Notamment résultat d'une action sur empty set.
# - Parfois passé à un argument pour dire que l'on veut pas utiliser cet argument.
# - valeur problématique (ex: as.numeric("Hello"))
# - is.na(VAL) disponible (détecte aussi NaN)
# - VAL [!=]= NA renvoie toujours NA
# - beaucoup de fonctions ont arg. optionnel na.rm (déf: FALSE) : si TRUE, NA et NaN sont ignorés
# - NaN est une constante spéciale, de type DOUBLE, comptant pour élément
# - indique une valeur arithmétique indéterminée
# - is.nan(VAL) disponible (ne détecte pas NA)
# - VAL [!=]= NaN renvoie toujours NA
#Résumé :
# +--------------+------------+------------+-------------+------------+-------------+
# | character(0) | numeric(0) | "" | NULL | NA | NaN |
# +----------+--------------+------------+------------+-------------+------------+-------------+
# | Type | STR | NUM | STR | NULL | NUM ou STR | DOUBLE |
# | Length | 0 | 0 | 1 | 0 | 1 | 1 |
# +----------+--------------+------------+------------+-------------+------------+-------------+
na.fail(VALv) #Si VALv contient un NA : emet erreur.
na.omit(VALv) #Si VALv contient un NA :
# - renvoie VALv sans ces NA (si ARRAY ou DATA.FRAME, enlève la rangée complète)
# - rajoute CLASS "omit"
# - rajoute attribut "na.action" UINTv avec anciens indexs des NA
na.exclude(VALv) #Comme na.omit, mais avec CLASS "exclude" (différence sémantique pour naresid())
na.pass(VALv) #Si VALv contient un NA : ne fait rien de particulier.
naresid(NA.ACTION,VALv) #NA.ACTION est na.action( VALv ), where VALv est na.*( VAL2v) . Renvoie VALv :
napredict(NA.ACTION,VAL)# - si CLASS "exclude", en rajoutant des NA (ou rangées de NA pour ARRAY et DATA.FRAME) là où un NA
# a été détecté.
# - si CLASS "omit", tel quel
#Donc :
# - VAR <- na.omit(VALv) ; napredict(na.action(VAR),VAR) renvoie VALv sans ses NA/rangée contenant un
# NA
# - VAR <- na.exclude(VALv) ; napredict(na.action(VAR),VAR) renvoie VALv en remplçant rangée contenant
# un NA par une rangée de NA
#Cela sert à ajuster une MODEL.FRAME devant être analysée.
vector(|mode) #Représente tout VALv de NUM STR ou RAW. Mode (déf: BOOL)
┌────────────────┐
│ ATTRIBUTES │
└────────────────┘
ATTRIBUTS ==> #Tout objet R peut avoir un ensemble d'attributs associés :
# - ils sont secondaires à l'objet principal, et accessibles via la LIST attributes(VAL)
# (lecture/écriture/création)
# - en général un getter/setter ATTR(VAL) existe comme raccourci à attributes(VAL)$ATTR
#Les éléments d'un vecteur/array n'ont pas d'attributs, seul le vecteur/array entier a une liste
#d'attributs pour chaque élément. Par ex., names(NUMv[VAL]) <- STR ne marche pas, mais
#names(NUMv) <- STRv si.
attributes(VAL) #Renvoie l'ensemble des attributs définis pour VAL sous forme de LIST. Lecture/Ecriture.
attr(VAL, STR|exact) #Equivaut à attributes(VAL)$STR
# - exact : si FALSE (déf: FALSE), match seulement partie de VALv possible.
structure(VAL,
ATTR=VAL...) #Renvoie VAL avec les ATTR donnés.
names(VALv) #Attribut nom STRv associé à chaque élément.
#Est imprimé au-dessus de cet élément lors d'un print.
#Grâce à la possibilité d'indexation via names, cela fait aux objets R des vectors associatives
#nativement via cet attribut.
#Assignation à l'ensemble de VALv remet ses names à NULL.
#name "" est possible, mais ne peut pas être indexé. Un name "" est assigné à tous les names non
#assignés une fois que names n'est plus == NULL
#Confusion possible :
# - VALv : names sont ceux des élements. Indexation par VAL["STR"]
# - LIST : names sont ceux des composants. Indexation par LIST$STR
# - ARRAY : names sont ceux des éléments lorsqu'ARRAY applatie. dimnames != names, et indiquent
# noms des rangées, tandis que names(dimnames) indiquent noms des dimensions.
comment(VALv) #Attribut commentaire STRv associé à l'ensemble de VALv.
#Faire plusieurs STR permet d'accéder à des parties du comment par index, ou d'insérer break
#typographique ou logique entre deux commentaires.
#Le commentaire n'est pas affiché sur la console, il doit être requested par comment()
┌──────────┐
│ LIST │
└──────────┘
list([NAME=]VAL,...) #Renvoie une LIST.
#Une LIST est un tuple de components aux types potentiellement différents.
#Il s'agit donc d'un vector generic.
#Chaque component est désigné par un index (sa position) et un NAME (déf: "", c'est-à-dire pas de
#NAME).
#Pour accéder aux components (écriture/lecture), soit :
# - LIST[[INDEX]]
# - LIST$NAME : toujours partial matching
# - LIST[[NAME_STR|exact]] : contrairement à LIST$NAME :
# - cela permet d'utiliser une variable STR.
# - exact (déf: TRUE, forcément named) : si FALSE, partial matching possible.
# Si NA, pareil, mais issue un warning.
# - getElement(LIST,NAME_STR)
#Il s'agit de primitives fonctions [[,$,[[<- et $<-
#L'index d'une LIST n'est pas imprimé par print lorsqu'un NAME existe pour un component, mais il y a
#tout de même un index.
#La structure basique de LIST est en fait celle englobant un seul component (une LIST d'un seul
#component), et les LISTv ne sont que des arrays de cette structure. C'est pourquoi :
# - LIST[INDEX] renvoie non le component à cet index, mais la structure basique l'englobant.
# - pour écrire sur une LISTv, il faut faire LIST[INDEX] <- list(VAL)
pairlist(...) #Comme LIST, sauf que pairlist(0) est NULL. Rarement utilisé
┌─────────┐
│ RAW │
└─────────┘
RAW ==> #Il s'agit d'un octet (comme un UCHAR numérique)
#Initialisé/assigné avec un UINT de 0 à 255
#Représenté par print sous forme hexadécimale
#Bitwise opérations possibles (shift : utiliser rawShift())
charToRaw(STR) #Conversion STR -> RAW
rawToChar(RAW|multiple) #Inverse
# - multiple (déf: FALSE): si TRUE, renvoie non une STR de length n, mais n STR de length 1
rawToBits(RAW) #Renvoie un RAW2 avec la représentation binaire de RAW (en fait RAW2 est hexadécimal, mais semble
#binaire dans l'output)
intToBits(UINT) #Pareil mais pour UINT.
packBits(RAW|type) #Conversion RAW (représentation binaire) -> RAW (représentation normale) si type est "raw" (déf) ou
#UINT (type = "integer")
rawShift(RAW,n) #RAW >> n
┌──────────────┐
│ LANGUAGE │
└──────────────┘
LANGUAGE OBJECTS ==> #Les language objects prennent leur contenu tel quel, non évalué, mais parsed. Doit être donc
#syntaxiquement correct.
# - "name" (mode) / "symbole" (typeof) :
# - symbole d'une variable, dont symbole d'une fonction, etc.
# - "call" (mode) / "language" (typeof) :
# - LIST-like de :
# - NAME d'une fonction
# - arguments de la fonction :
# - VAL... si non-var
# - NAME... si var non-functions
# - CALL... si var functions: compound CALL
# (ex: 1+1+1 -> +(1,+(1,1)) ou { CALL... } -> {(CALL...) )
# - [[INDEX]] possible. Si arguments sous la forme VAR=VAL, CALL$VAR possible.
# - "expression" :
# - LIST-like de CALL :
# - ensemble de lignes de commandes, dont fichiers .R
# - [[INDEX]] possible. EXPRESSION$VAR possible si expression(VAR=STATEMENT)
quote(EXPR) #Renvoie EXPR sous forme de CALL ou (si pas fonction) SYMBOL ou VAL.
#Pour quote(VAR = VAL), faire quote(`=`(VAR,VAL))
bquote(EXPR|where) #Comme quote(), sauf que les .(EXPR2) dans EXPR sont remplacés par eval(EXPR2)
#Peut être utilisé à la place d'un substitute( EXPR, list( ... ) )
substitute(EXPR|env) #Comme quote(), sauf que les NAME sont remplacés par leur VAL non évaluée.
# - à condition qu'env (déf: ENVIRONMENT courant) ne soit pas .GlobalEnv, auquel cas renvoie NAME
# tels quels
# - env peut aussi être une LIST désignant alors les VAR=VAL d'un ENVIRONMENT temporaire.
#Sert à avoir le CALL d'un arg tel qu'il a été appelé, sans évaluation.
#Ex:
# - x <- 3 ; function(val) { deparse(substitute(val)) }(x) renvoie "x"
# - x <- 3 ; function(val) { deparse(val) }(x) renvoie "3"
#Pour substitute non une EXPR mais un CALL contenant EXPR, faire :
# - eval( substitute( substitute( CALL ), list( CALL = CALL ) ) )
call(STRING,ARGS) #Renvoie appel d'une function dont le nom est STRING avec ARGS..., sous forme de CALL
expression
([VAR=]EXPR...) #Renvoie sous forme d'EXPRESSION
eval(LANGUAGE|envir) #Perform le language object. Les NAMES sont recherchés dans envir (def: ENVIRONMENT courant)
#A noter qu'eval(VAL) sur un objet non-LANGUAGE est équivalent à VAL (pas d'action et arguments envir
#et enclos inutiles)
#eval(EXPRESSION) renvoie la VAL du dernier eval(CALL) des CALL... d'EXPRESSION
evalq(VAL|envir) #Equivaut à eval(quote(VAL)|envir)
eval.parent(LANGUAGE|n) #Equivaut à eval(LANGUAGE,parent.frame(n))
local(LANGUAGE|envir) #Comme evalq(), sauf qu'envir par déf. est new.env()
with(VAL,EXPR) #Comme evalq(EXPR,envir=VAL), sauf que :
# - envir peut également être :
# - une DATA.FRAME, utilisée alors comme LIST de VAR. Cela permet de faire un attach() temporaire,
# et c'est d'ailleur l'usage principal
# - un UINT comme dans sys.call() pour désigner un ENVIRONMENT
# - l'ENVIRONMENT est temporaire, les assignations sont perdues aussitôt
within(VAL,EXPR) #Pareil, sauf que :
# - VAL est seulement LIST ou DATA.FRAME
# - sa copie temporaire après évaluation d'EXPR est renvoyée
deparse(LANGUAGE) #Renvoie LANGUAGE sous forme de STR
parse(|file,n,text, #Inverse, renvoie EXPRESSION à partir d'une STR. Utilisé par exemple par source() ou par la console R.
prompt,srcfile) # - input peut venir d'un file ou d'un text STR. Si file est stdin, prompt (déf: "?", NULL pour
# default R prompt, option "prompt") est imprimé.
# - n (déf: NULL) : taille maximum d'EXPRESSION. Si stdin et que n=0, en fait n=1, et si n<0, en fait
# n=0
enquote(CALL) #Semble renvoyer un CALL2 avec "quote(CALL)", afin qu'un eval() renvoie CALL non évalué.
match.call(|definition, #Renvoie le CALL de l'appel à la fonction courante. Contrairement à sys.call :
call,expand.dots) # - le name des named parameters est rajouté si omis dans l'appel, et rallongé si abbrégés
# - si expand.dots FALSE (déf: TRUE), ... est non remplacés par arguments mis, mais sous la forme
# "... = list(ARGS)"
# - on peut alors faire CALL$... pour avoir une LIST des arguments variadic
#Et moins utile :
# - définition (déf: NULL) NAME : utilise les formals non de la fonction courant, mais de la fonction
# NAME
# - call (déf: CALL courant) : CALL à utiliser
#Utilisation en général :
# - deparse le CALL afin de l'imprimer ou de le mettre en attribut
# - ou passer les arguments actuels non évalués à une seconde fonction.
# - ex: VAR <- match.call
# VAR$ARG <- VAL... (NULL si suppression)
# VAR[[1]] <- as.name(FUNC_STR)
# eval.parent(VAR)
# - en général, expand.dots FALSE, ce qui permet de faire VAR$... <- NULL parceque FUNC_STR ne
# prendra peut-être pas les mêmes args variadiques
#Si pour un seul arg, march.call()$VAR, préférer substitute(VAR)
all.names(LANGUAGE #Renvoie une STRv de tous les NAMES contenus dans LANGUAGE.
|functions,max.names, # - functions (déf: TRUE) : si FALSE, les NAMES de nom de fonction sont omis
unique) # - max.names (déf: -1) : length max du result
# - unique (déf: FALSE)
all.vars(...) #Pareil, mais avec défaut inversés pour functions et unique (renvoie donc NAMES de VAR uniquement)
┌──────────────┐
│ FORMULAE │
└──────────────┘
FORMULAE ==> #Il s'agit de Y ~ X, où Y est une response variable et X une explanatory variable.
#Y et X doivent être de même taille n.
#Chaque yₙ correspond avec un xₙ, de sorte que si xₙ, alors yₙ.
#Avec un plot, cela donne un ensemble de points (xₙ,yₙ)
#Il s'agit en fait d'un CALL `~`(Y,X) qui a je crois juste comme effet de créer un CALL jumeau.
#Est en général manipulé par les fonctions qui convertissent formula en DATA.FRAME via model.frame() :
# - fonction prend (formula,data) (FORMULA ou DATA.FRAME) et le passe à model.frame() qui renvoie une
# DATA.FRAME
#La première colonne de la DATA.FRAME est la response variables, les autres sont explanatory.
#Cf model.frame pour les différentes syntaxes d'une FORMULA.
#Attention, si X est exprimé avec les mêmes termes/mots que Y, il devient 1:n
#De nombreuses fonctions peuvent prendre (une DATA.FRAME ou une ...) ou une FORMULA (via missing())
#remplaçant alors ... . Alors, souvent les args de model.frame sont possibles en plus : data, subset,
#na.action.
model.frame(|formula, #Renvoie une DATA.FRAME à partir de FORMULA ou data (une DATA.FRAME). FORMULA est prioritaire : si
data,subset,na.action, #deux sont présents, data est ignoré, si ce n'est que son ENVIRONMENT peut être utilisé (ce qui
drop.unused.levels) #permet de faire VAR1 ~ VAR2 au lieu de DATA.FRAME$VAR1 ~ DATA.FRAME$VAR2.
# - subset (déf: NULL) UINTv : si non-NULL, ne garde que les rows numéro UINTv.
# - na.action NAME_STR : fonction NAME prenant une VAL et la renvoyant en fonction des NA qu'elle
# contient. Par ex, na.omit, na.fail, na.exclude ou na.pass. Déf: 1) attribut na.action(VAL),
# 2) options("na.action") (déf: na.omit), 3) na.fail
# - drop.unused.levels (déf: FALSE) : si droplevels() doit être effectué
#DATA.FRAME a un attribut terms qui garde la FORMULA en mémoire :
# - CALL de la FORMULA
# - avec comme attributs :
# - variables : LIST des NAME de la FORMULA
# - term.labels : STR des NAME des explanatory var.
# - intercept : 0 si l'intercept doit être 0, 1 sinon
# - dataClasses : CLASS des var
# - factors : matrix de chaque VAR avec chaque combinaison de VAR... :
# - 1 si unique(VAR, VAR...) sont combinés via * (potentiellement dans une combinaison plus large
# encore)
# - combinaison / est bizarre, rajoute des 2, enlève des colonnes...
# - order : nombre éléments des colonnes de combinaisons de VAR...
#FORMULA possibles et colonnes de la DATA.FRAME en résultant et attributs autre (X,Y,Z sont NUMv ou
#FACTORv) :
# - Y ~ Y -> Y
# - membres à droite identiques à membres à gauche sont ignorés
# - Y ~ X + Z + ... -> Y,X,Z,...
# - Y ~ ... [±0|1] -> ... (intercept 1 si +, 0 si -)
#Combinaisons (ne semble pertinent que pour factors) :
# - B ~ A + C + ... -> A xor C xor ...
# - B ~ A - C - ... -> A
# - B ~ A * C * ... -> A or C or ...
# - B ~ A:C:...
# B ~ A %in% C %in% ... -> A and C and ...
# - B ~ (...)^NUM -> ..., avec taille max de NUM
# - B ~ A / C -> A or (A and C) ???
#X, A, etc. peuvent être des résultats de fonction, par exemple log(X) :
# - cependant, si fonction est + - * ou ^, il faut protéger avec I() (ex: Y ~ X + I(X*Z) + I(X^2))
I(VAL) #Rajoute classe AsIs. But :
# - pour data.frame(VAL), cf data.frame
# - pour formulas, cf dessus
┌──────────────────┐
│ ENVIRONMENTS │
└──────────────────┘
ENVIRONMENTS ==> #Il s'agit de pointeurs vers une frame contenant des variables locales à une fonction/frame donnée.
#Les variables qu'elle accède par défaut sont ceux de son ENVIRONMENT et de ses parents.
#Un ENVIRONMENT est une addresse, mais peut être caractérisée :
# - par un ENVIRONMENTNAME, comme c'est le cas des packages loaded, de R_EmptyEnv et de .GlobalEnv
# - par un attribut name, comme c'est le cas des objets attached (qui n'ont pas par déf.
# d'ENVIRONMENTNAME)
#Une frame n'a qu'un ENVIRONMENT, mais un ENVIRONMENT a toujours un parent (sauf R_EmptyEnv)
#Le "search path" est l'ensemble des ENVIRONMENT de la function courante, soit l'ENVIRONMENT courant
#et ses parents. Il commence par les enfants, prioritaires, puis les parents :
# - le dernier enfant est l'environment courant
# - puis vient à un moment .GlobalEnv, hérité par défaut par tout nouvel ENVIRONMENT, et
# ENVIRONMENT de la fonction globale.
# Accédé via variable .GlobalEnv ou globalenv()
# - l'avant-dernier parent est package::base, précédé de tous les autres packages loaded
# Accédé via variable .BaseNamespaceEnv ou baseenv()
# - le dernier parent est R_EmptyEnv, ne pouvant contenir aucune variable.
# Accédé via emptyenv()
#Il faut distinguer :
# - l'ENVIRONMENT de la définition de la closure, typiquement .GlobalEnv (mais peut être modifié)
# - l'ENVIRONMENT de chaque exécution de la closure, enfant du dernier. Par conséquent, par défaut,
# chaque exécution de fonction hérite de .GlobalEnv. Par conséquent -> lexical scoping
#Il faut aussi distringuer :
# - le parent de l'ENVIRONMENT, qui est lié au search path (parent.env())
# - la frame parente de la frame contenant ENVIRONMENT, qui est lié au call stack (parent.frame())
# call stack != search path
#A noter :
# - si l'on veut que la frame enfant hérite de l'ENVIRONMENT courant, faire :
# - environment(FUNC) <- environment() ; FUNC()
# - cependant, fonctions non enfants, mais définies dans fonction courante ont l'ENVIRONMENT
# courant. Donc une FUNC2 définie (et non invoquée) par une FUNC1 peut utiliser les variables de
# FUNC1.
# - ex: b <- function() { a <- 1 ; function() a }, alors b() renvoie function() 1
# - les { CALL... } et ( CALL... ) sont des arguments de { et ( et sont donc évalués dans la frame
# courante. Par conséquent leur ENVIRONMENT est le même que la fonction courante.
#Si une VAR existe pour un ENVIRONMENT et l'un de ses parents, celui de l'ENVIRONMENT "masque" le
#parent.
#Plusieurs fonctions ont un argument pour spécifier l'ENVIRONMENT :
# - pos/name/where :
# - si UINT, position dans le search path
# - si -1, ENVIRONMENT courant (défaut)
# - si STR, nom dans le search path
# - ENVIRONMENT
# - envir : ENVIRONMENT (déf: ENVIRONMENT courant) ou LIST( VAR=VAL ) créant un ENVIRONMENT temp avec
# des VAR...
environment([CLOSURE]) #Renvoie l'ENVIRONMENT de CLOSURE, par défaut fonction courante. Ecriture ne marche pas si
#fonction courante.
parent.env(ENVIRONMENT) #Renvoie ENVIRONMENT parent d'ENVIRONMENT
new.env(|hash,parent) #Crée un ENVIRONMENT :
# - hash (déf: TRUE) : s'il doit utiliser une hash table
# - parent (déf: parent.frame())
sys.frames() #Renvoie PAIRLIST des ENVIRONMENT d'exécution de la fonction actuelle et de ses parents
#(ancêtre == 1), hors fonction globale.
sys.frame(|which) #Renvoie l'ENVIRONMENT d'exécution de la fonction désignée par which (déf: 0) (cf which en bas)
#Cependant pour 0, semble indiquer non la fonction courante mais la top level fonction.
parent.frame(|n) #Pareil, mais désigne la fonction comme sys.parent()
sys.calls() #Pareil avec les CALL ayant invoqué la fonction actuelle et ses parents.
sys.call(|which) #Renvoie le CALL de la fonction désignée par which (déf: 0) :
# - nombre négatif, dont -0 : énième parent (0 est fonction courante)
# - nombre positif : 1 est ancêtre, etc.
sys.function(|which) #Renvoie le body sous forme de CALL.
sys.parents() #Comme sys.calls mais avec numéro dans le call stack (ancêtre == 0)
sys.nframe() #Pareil pour frame actuelle
sys.parent(|n) #Pareil pour le parent numéro n (1:parent direct, 2: grand-parent, etc.) (déf: 1)
sys.status() #Fait un sys.frames(), sys.calls() et sys.parents() et le traduit en PAIRLIST
environmentName
(ENVIRONMENT) #Attribut ENVIRONMENTNAME
search() #Imprime nom des ENVIRONMENT du search path courant sous forme de STRv.
searchpaths() #Indique les paths STR associées à chaque élément du search path :
# - pour un package, son chemin de répertoire
# - pour les autres, leur nom de variable.
ENVIRONMENT$VAL #Accède à la valeur VAL d'ENVIRONMENT
get(STR|pos,envir) #Pareil, avec le nom de variable STR
exists(STR|where,envir, #Renvoie TRUE si variable dont nom est STR existe dans ENVIRONMENT
inherits) # - inherits : comme assign(), mais déf: TRUE
assign(STR,VAL #Assigne VAL à variable dont nom est STR, et dont l'ENVIRONMENT est pos/envir.
|,pos,envir,inherits) #VAR <- VAL est un alias, avec l'ENVIRONMENT courant
# - inherits (déf: FALSE) : si TRUE :
# - l'ensemble des ENVIRONMENT parents sont aussi considérés, avec les enfants prioritaires
# - l'assignement échoue si VAR n'existe pas encore (création impossible donc)
rm(STRouVAR|pos,envir) #Enlève une variable d'ENVIRONMENT
#remove() est un alias
ls(|name,envir, #Imprime nom des variables d'ENVIRONMENT sous forme de STRv.
all.names,pattern) # - all.names (déf: FALSE) : si FALSE, n'imprime pas STR commençant par "."
# - pattern (déf: ".*") : regexp filter (STR contenant, non matchant, pattern)
#objects() est un alias de ls()
attach(LIST|pos,name, #Transforme LIST en ENVIRONMENT, et l'attach au search path, sous le nom STR name (déf: nom de var.),
warn.conflicts) #à la position pos (déf: 2, min. 2).
#Attention, attach une copie, donc LIST$VAR et VAR désignent deux choses différentes.
#But est surtout de ne pas taper LIST$
# - warn.conflicts (déf: TRUE) : si TRUE, warning si vars masquées
detach(LIST|pos) #Inverse.
┌──────────────────────────┐
│ INDEXATION ET ARRAYS │
└──────────────────────────┘
INDEXATION ==> #Pour VARv[UINTv] et [STRv], si n'existe pas, écriture en rajoutant des NA si besoin de rallonger
#taille. En lecture, renvoie NA. Ne marche pas si VARv n'existe pas encore.
#Argument possible pour tout indexation : drop (déf: TRUE) : effectue un drop() sur le résultat avant
#de le renvoyer.
VARv[BOOLv] #Renvoie un VAR2v, après élimination des indexs dans VARv correspondant à un FALSE dans BOOLv
#BOOLv est répété si besoin.
VARv[UINTv] #Renvoie un VAR2v, où chaque élément est celui à l'index UINTv correspondant dans VARv.
#UINTv n'est pas répété: taille de VAR2v == taille de UINTv.
#UINTv -> donc VAL:VAL2 est possible.
#Indexation commence à 1, non 0. 0 est ignoré (peut donc indiquer un élément à ne pas indexer)
#Un FLOAT est trunc'd().
VARv[-UINTv] #Renvoie un VAR2v, après élimination des indexs dans VARv correspondant aux indexs UINTv.
VARv[STRv] #Renvoie un VAR2v, avec l'ensemble des premiers éléments ayant l'un des name STRv.
#Si n'existe pas, en écriture, le rajoute à la fin du vecteur.
[ #[ est une fonction spécialisable, signature : (x,i,drop).
#(i,j) avec missing() pour prendre en charge d'un seul arg., si objet est de dimension 2, etc.
[[ #Pareil
ARRAYS ET MATRICES ==> #Une "array" est un vecteur VALv avec un attribut dim indiquant le nombre de dimensions, et un attribut
#optionnel dimnames indiquant le nom de chaque rangée.
#Il s'agit de matrices informatiques, non mathématiques. Elles peuvent cependant être manipulées
#mathématiquement (cf dessous)
#La première dimension est la rangée, puis colonne, contrairement à C. Donc arrays 1-dimension, dont
#c() et 1:10 sont des columns, bien qu'imprimées en rangée.
dim(VAL) #Attribut étant un UINTv dont chaque élément est la taille d'une dimension.
#Donc longueur de ce vecteur == nombre de dimensions de VAL.
#prod(dim(VAL)) == nombre d'éléments de VAL.
#Lors d'un changement de dimensions, l'array est dépliée/repliée pour matcher les nouvelles dimensions.
#Attributs désignant les éléments de VAL les désigne parfois comme si VAL était applati (ex: names)
dimnames(VAL) #Attribut LIST étant comme names, mais pour les rangées de chaque dimension et les dimensions
#elles-mêmes.
#Les names des components de la LIST <-> nom des dimensions, et chaque component STRv <-> nom des
#rangées de cette dimension.
#Un STRv peut être NULL. Sinon, il soit être de length == nombre de rangées de la dimension.
#Les dimnames sont imprimés en console à la place des indexs, et peuvent être utilisés comme indexs
#(noms des rangées, pas des dimensions).
ARRAY[VAL,...] #Indexation comme pour un vecteur normal : UINT, -UINT, BOOLv, STRv, pour chaque dimension.
#BOOLv doit avoir même taille que la dimension qu'elle indexe. Dans tous les cas, BOOLv n'indexe
#qu'une dimension.
#STR désigne le dimname, non le name.
#VAL absente signifie ensemble de la dimension, par ex. VAL[VAL2v,]
ARRAY[VALv] #Si pas de virgule dans l'indexation, applati l'array en une dimension avant son indexation.
#Indexation STRv sera alors par name, non dimname.
ARRAY[MATRIX] #Chaque rangée de MATRIX indique un élément à indexer. Une rangée == coordonnées de l'élément à
#indexer, dimension par dimension. Par conséquent, nb.colonnes de MATRIX == nb.dimensions d'ARRAY.
array(VALv|dim,dimnames)#VALv <- array(VALv,VAL2v) équivaut à dim(VALv) <- VAL2v, mais est à préférer.
#as.array() et is.array() sont dispos.
# - dim (déf: length(VALv)), dimnames (déf: NULL)
matrix(VALv|nrow,ncol, #Comme array(VALv, c(nrow, ncol)).
byrow,dimnames) # - byrow : si TRUE (déf: FALSE), remplit rangée par rangée, non colonne par colonne.
rbind(ARRAY...) #Renvoie une ARRAY étant la superposition verticale des ARRAYS (VALv possible). Ils doivent avoir
#un nombre de colonnes divisibles entre eux (si plus petit, est itéré).
#Le nom des dimnames est celui des ARRAY pour les rangées, et celui du premier ARRAY pour les colonnes.
cbind(ARRAY...) #Pareil inverse avec superposition horizontale.
aperm(ARRAY,UINTv) #Transpose ARRAY, c'est-à-dire permute dimensions. Exemple d'UINTv : c(4,1,2,3) pour mettre 4ème
#dimension en 1ère dimension
t(ARRAY) #Equivaut à aperm(ARRAY,2:1)
drop(ARRAY) #Supprime les dimensions de taille 1.
MATRICE MATHEMATIQUE ==>#Ces opérations sont mathématiques, pas éléments par éléments :
ARRAY %*% ARRAY2 #Fait une multiplication de matrices.
#Doivent avoir mêmes dimension.
ARRAY %o% ARRAY2 #Outer product (cf plus bas pour autre usage)
solve(ARRAY[,ARRAY2]) #Renvoie ARRAY⁻¹ %*% ARRAY2
# - défaut d'ARRAY2 est Iₙ, donc renvoie alors inverse d'ARRAY
# - sinon résout système d'équation ARRAY * X = ARRAY2
#Erreur si ARRAY est singular
┌───────────────┐
│ FONCTIONS │
└───────────────┘
TYPES DE FONCTIONS ==> # - attributs, que l'on peut utiliser en lecture ATTR(...), ou en écriture ATTR(...) <- ...
# - getter, qui renvoie un résultat.
# - setter, qui effectuent une action.
#Je précise "Attributs" ou "Renvoie" pour les deux premiers. Leur absence pour le dernier.
FUNC #Imprime notamment déclaration de fonction (sauf si builtin)
FUNC(...) #Exécute fonction
function(ARGS) #Renvoie une FUNC (CLOSURE), que l'on peut ensuite assigner à une variable.
{ #Si VAL est le dernier statement, on peut omettre return(). return() renvoie NULL.
... #ARGS = VAR...
return(VAL) #A trois éléments :
} # - une liste d'arguments, sous forme de PAIRLIST
# - accédé via formals(CLOSURE) :
# - valeur du component est celle par défaut
# - ou args(CLOSURE)
# - un ENVIRONMENT (par défaut enfant de .GlobalEnv)
# - accédé via environment(CLOS)
# - un body, sous forme de CALL
# - accédé via body(CLOSURE)
#Une closure peut être byte-compiled (par opposition à une primitive compiled)
ARGUMENTS ==> # - positionnels, avec en plus named parameter si invoqué sous la forme FUNC(VAR=VAL,...)
# - possibilité d'utiliser abbréviation des noms, si pas ambigu
# - génériques (pas de type)
# - valeur par défaut : function(VAR=DEF_VAL)
# - peut la changer via formals(FUNC)$VAR <- DEF_VAL
# - variadic argument :
# - function(...)
# - nom des VAR est "...", mais doit être concaténé via c(...) ou list(...) pour être utilisé
# (préférer list())
# - ..UINT désigne le variadic arg. numéro UINT
# - list(...) est list(0) (et c(...) est NULL) si aucun arg. n'est rentré
# - si l'on passe des named parameters dans ..., list() récupère les names
# - souvent utilisé par un wrapper pour passer argument à la fonction sous-jacente
# - void : rien
# - liste ARG_STR de STR possibles, avec abbréviation possible, pour un arg STR :
# - sous la forme var=STRv
# - ensuite faire dans la fonction arg <- match.arg(var|choices,several.ok)
# - fonctionnement :
# - match.arg() renvoie premier STR de choices contenant var (partial matching)
# - choices est par défaut la default value de l'argument de la fonction courante ayant le name
# var
# - si var est NULL (par ex., pas d'argument lors du call), la première valeur de choices est
# renvoyée (valeur par défaut donc)
# - var peut être un vecteur et renvoyé un vecteur de même taille avec une série de matching, si
# several.ok est TRUE (déf: FALSE)
# - erreur si pas de matching possible
# - peut prendre comme VAL un autre argument VAR
#Un argument, même non-optionnel, peut être omis par le caller sans erreur, à condition que cet
#argument ne soit pas utilisé dans la fonction. Seule utilité selon moi :
# - missing(ARG) : renvoie TRUE si ARG n'a pas été spécifié. Permet par exemple de définir deux
# comportements : un quand caller supplies ARG, l'autre non.
# Contrairement aux default values qui change la valeur d'une ARG non supplied, ceci change le
# comportement de la fonction.
# Ne pas l'invoquer si ARG a été modifié dans la fonction.
#Call sont toujours par value, jamais par référence.
LAZY EVALUATION ==> #Un argument enregistre d'abord seulement le CALL du paramètre passé mais ne l'évalue pas ("promise")
#Lorsque l'argument est utilisé, il est évalué : on utilise alors l'ENVIRONMENT de la frame du
#paramètre pour l'évaluer, soit :
# - pour un paramètre normal, la frame parente
# - pour une valeur par défaut, la frame courante
#Donc :
# - changer la frame parente avant l'utilisation d'un argument peut donc modifier cet argument.
# - changer valeur d'un argument VAR1 sur laquelle est basée la default value d'un argument VAR2 avant
# que VAR2 soit évalué, changera VAR2
#Dans les deux cas, on peut forcer l'évaluation en faisant seulement VAR1 sur une ligne
#(ou force(VAR1) qui est équivalent)
#Promises peuvent être créer manuellement via :
# - delayedAssign(NAME_STR,EXPR|eval.env,assign.env)
# - fait que dès que VAR dont nom est NAME_STR devra être évaluée, VAR <- EXPR sera d'abord
# effectué.
# eval.env et assign.env sont par défaut le parent.env()
RECURSION ==> #Recursion et mutual references ne posent pas de prob. puisque la définition d'une fonction n'est
#évaluée que lors de son exécution (sinon il s'agit d'une EXPRESSION non évaluée)
(function(ARGS) EXPR)
(VAL...) #Anonymous function
`FUNC<-` <- function #Définition d'un getter :
(ARGS,value) # - exécuté sous la forme FUNC(ARGS) <- VAL
# - value est obligatoire, et remplacé par VAL
# - ARGS semble devoir être de taille au moins 1
# - `` pour échapper <-
FUNCTORS ==> # - faire FUNC <- match.fun(FUNC|STR,descend) pour une fonction prenant un FUNC permet de produire une
# erreur si argument n'est pas une FUNC
# - descend (déf: TRUE) : si TRUE, si arg pas FUNC, recherche dans environments parents si
# symbole du même nom (masqué donc par le premier) est lui une FUNC
# - intérêt est check du type, ou récupération de la FUNC à partir de son NAME ou STR
# - une FUNC1 peut renvoyer un functor FUNC2 et :
# - puisque définition de function FUNC2 a l'ENVIRONMENT courant de la fonction locale FUNC1,
# la définition/comportement de functor renvoyé peut dépendre des arguments de FUNC1
# - en plus, grâce au language objects, le corps même du functor peut être variable
ARGUMENT BINDING ==> #Plutôt que de laisser l'user créer un wrapper de functor, en général, une fonction prenant un
#FUNC comme argument, permet de spécifier des args pour FUNC via un ... (ex: apply)
ARGUMENT CALL ==> # - faire CALL <- match.call() pour avoir le CALL de la fonction courante, mais sans abbréviation
# éventuelle, avec name de tous paramètres, et dans l'ordre.
PRIMITIVE FUNCTIONS ==> #Liste par builtins() (en fait pas vraiment)
#Pour les fonctions symboles, on peut les utiliser également via :
# - .Primitive("+")(1,1)
# - `+`(1,1)
#En fait souvent FUNC est un simple wrapper invoquant .Primitive(FUNC_STR).
#Contrairement aux CLOSURE, elles n'ont pas de body + formals + environment, mais sont compilées.
#Elles n'ont pas de named parameters non plus.
SPECIAL FUNCTIONS ==> #Certains builtins n'évaluent pas leur argument :
# - while, switch, return, repeat, next, if, function, for, break
# - &&, ||, =, <-, <<-, ~, $, @, {, [[, [
# - quote, substitute, expression, call
# - on.exit, UseMethod, signif, round, rep, missing, log, .Internal
#Ils ont alors le type "special".
%NAME% #Si le nom d'une fonction est ainsi et qu'elle prend slt 2 args, elle peut être exécutée sous la
#forme VAL1 %NAME% VAL2
┌────────────────────┐
│ TYPES COURANTS │
└────────────────────┘
table(FACTORv...|dnn, #Renvoie une TABLE comptant le nombre d'occurences croisées de FACTORv :
deparse.level) #ARRAY UINT où :
# - 1 dimension == 1 FACTORv (chaque FACTOR == une rangée)
# - éléments UINT compte le nombre d'occurences de l'union des FACTORv entre eux.
# L'élément n de chaque FACTORv doit donc être sémantiquement le même.
#Si un seul FACTORv, compte donc seulement les occurences d'un FACTORv.
#Chaque dimension est triée alphabétiquement selon son dimname.
# - dnn : name des dimensions elles-mêmes (déf: cf deparse.level).
# - deparse.level UINT : par défaut dnn est rempli avec le nom de variable des UINT premiers
# FACTOR, et les autres avec NULL (déf: 1)
data.frame(NAME=VAL,... #Construit une DATA.FRAME, type souvent utilisé comme database.
|row.names) #Il s'agit d'une LIST dont chaque component est traité comme la colonne d'un tableau.
#Une VAL == une colonne. En général, colonnes sont des variables statistiques, et rangées des
#observations.
#Chaque component doit avoir même length, ou sinon les colonnes plus courtes sont itérées, à condition
#d'être un facteur divisible.
#Si VAL est une STR, elle est coerced en FACTOR. Sinon coerced en NUM.
#NAME est par défaut le nom de la VAR. Aucun name ne devrait être "", et names doublons doivent être
#évités.
#L'attribut STRv row.names désigne le nom des rangées. Par défaut, les names ou dimnames de la 1ère
#VALv ou, si absent, un nombre s'incrémentant.
#Puisque DATA.FRAME est une LIST, les col names sont ses names.
#Comportement spécial d'une VAL en input :
# - pour une ARRAY :
# - elle est applatie à deux dimensions, avec chaque colonne == une colonne dans la DATA.FRAME
# - pour une LIST :
# - chaque component de la LIST == une colonne
#Elle peut être indexée comme une matrice avec comme différences :
# - D.F[VAL] équivaut à D.F[,VAL], et imprime non un vecteur, mais une matrice de largeur 1
# (verticale)
# - names et row.names, et non dimnames[[1]] et dimnames[[2]]
#VAL peut être I(VAL), auquel cas :
# - type de VAL n'est pas coerced vers NUM ou FACTOR
# - LIST et ARRAY sont mis sur une seule colonne
ts(NUMv|start,end, #Crée une TS, time-serie avec NUMv. Le temps est calculé en time unit (année, etc.), elle-même
frequency,deltat,class) #fractionnée en measurement unit (mois, etc.). Le rapport time unit/measurement unit est frequency
#(déf: 1) ou deltat (1/frequency). start et end sont des NUMv de taille 2 (si taille 1, 2ème élément
#== 1), spécifiant {time unit,measurement unit}. La taille de TS est le nombre de measurements entre
#start et end, selon le measurement unit (NUMv tronquée à la fin si besoin). start et end comprennent
#l'ensemble de NUMv par déf.
# - class STR : nom de classe au lieu de "ts"
#TS a un seul attribut tsp : NUMv de taille 3 (start,end,frequency). Start et end sont des décimaux
#exprimés en time unit.
#hadTsp(NUM) existe.
window(...) #Mêmes arg. que ts() sauf que prend un TS comme NUMv. Sert à repréciser son start/end/frequency afin
#d'obtenir une "fenêtre" partielle de la TS.
time(TS) #Renvoie un NUMv allant de start à end, avec un pas de 1/frequency (et attribut tsp).
cycle(TS) #Renvoie un NUMv représentant numéro de la measurement unit par rapport à sa time unit pour
#l'ensemble de time(TS) (et attribut tsp)
┌────────┐
│ OO │
└────────┘
OBJECT-ORIENTED ==> #La classe d'un objet est seulement un attribut STRv class, désignant également les classes
#ancêtres. Si type fondamental, class == type.
#Mis à part types courants STR, NUM, etc., CLASS signifie que CLASS est une classe.
#Le . dans un nom de variable n'est pas OO-syntaxique, juste OO-sémantique
#Fondée sur la prog. générique :
# - les objets sont génériques, leur classe est seulement un attribut class, que l'on peut changer.
# - un attribut est générique : on peut rajouter un attribut à tout OBJET, et les fonctions ne
# checkent pas le type de l'objet, mais seulement la présence d'un ATTR(OBJET) non-vide.
# -> ATTR(OBJET), non OBJET.ATTR
# - les fonctions prennent des types génériques, checkent la CLASS de l'argument, et invoquent des
# fonctions spécialisées, appelées "méthodes" pour cette CLASS, par opposition à la "fonction
# générique"
# -> FONC.CLASS(OBJET) invoqué par FONC(OBJET), non OBJET.FONC()
class(VAL) #Attribut class STRv. Dernier STR est ancêtre.
#Si pas de CLASS, une classe implicite est substituée, en général le mode()
unclass(VAL) #Supprime l'attribut class.
is.object(VAL) #Renvoie TRUE si VAL a une CLASS explicite.
"S3 SCHEME" ==>
UseMethod(FUNC_STR #Invoque FUNC_STR.THISCLASS(ARGS) où :
|object) # - ARGS sont les ARGS de la fonction courante
# - THISCLASS est la CLASS d'object (déf: premier ARG)
# - commence par classe enfant jusqu'à ancêtre
# - si aucune FUNC_STR.THISCLASS définie, invoque FUNC_STR.default
# - en général FUNC_STR est le nom de la fonction courante (fonction générique)
# - variables présentes dans la fonction spécifique "FUNC_STR.THISCLASS":
# - .Generic : FUNC_STR
# - .Method : FUNC_STR.THISCLASS
# - .Class :
# - CLASSE du premier ARG, à partir de THISCLASS comme premier enfant
# - si .default, vide
# - l'ENVIRONMENT de la méthode spécifique est une copie de l'ENVIRONMENT de la fonction générique.
# - cependant, utiliser des VAR définis par la fonction générique, bien que possible, semble
# générer un warning (à moins de faire VAR <- VAR) et est déconseillé
# - toutes les expressions suivants UseMethod() ne sont pas exécutées
NextMethod(|FUNC_STR #Pareil sauf que :
,object,...) # - THISCLASS est la CLASS d'object, sans le premier élément (premier enfant)
# - FUNC_STR est par défaut .Generic (NULL donne la valeur par défaut)
# - THISCLASS est par défaut le deuxième élément de .Class ("default" si aucun)
# - le .Class est définie comme :
# - le .Class actuel sans son premier élément (NULL donne val par défaut)
# - avec un attribut previous contenant .Class actuel et (si non premier appel) avec comme attribut
# le previous de .Class. Ainsi .Class contient la chaîne des classes des méthodes appelées.
# - si les ARGS ont été modifiés, leur version modifiée est passée. Donc en général, une méthode
# enfant modifie les ARGS, et appelle la méthode parente.
# - utilisé donc dans une FUNC_STR.THISCLASS() pour invoquer la méthode de la THISCLASS parent.
# En général méthode enfant est effectuée avant la méthode parente.
# - ne copie pas l'ENVIRONMENT
# - les expressions suivant NextMethod() sont exécutées
# - il est possible de passer des arguments supplémentaires ou remplacer des named arguments existants
# via ...
# - ex: NextMethod(NULL,NULL,ARGS)
INVOCATION DIRECT D'UNE #Alors :
METHODE ==> # - .Class est la CLASS du premier ARG
# - .Generic n'est pas définie, ce qui fait buguer NextMethod si FUNC_STR est la valeur par défaut
# - cela peut être résolu en faisant un .Generic <- FUNC_STR au début, mais je ne sais pas s'il
# s'agit d'une bonne pratique
#Invocation directe via fonction anonyme d'une méthode ne marche jamais.
methods
(|generic.function, #Liste les méthodes pour la fonction générique donnée (déf: toutes), ou la classe donnée (déf: toutes)
class) #Fondé uniquement sur la convention de nom FONC.CLASS.
"S4 SCHEME" ==> #Une S4 classe est définie par :
# - un nom CLASS_STR
# - un ensemble de slots, valeur auxiliaires :
# - accédé via VAR@SLOT
# - Equivaut à un attribut
# - representation : classes des slots, en général généré via representation()
# - prototype :
# - valeur par défaut des slots généré en général via prototype()
# - si pas valeur par défaut spécifiée pour un slot, utilise le prototype() de sa classe
# - il s'agit de vecteurs vides pour les types basiques
# - dont un "unnamed" slot @.Data, valeur centrale :
# - son type est défini dans representation() et sa valeur par défaut dans prototype()
# - là où [VAR=]VAL est attendu avec comme VAR un name de slot, omettre VAR désigne alors toujours
# le @.Data
# - semble devoir être une basic class ou virtual class ???
# - des classes parents ("superclasses") :
# - désigné via contains de setClass()
# - il semble que la classe du @.Data == classe parent
#Une CLASS est registered via setClass(), qui crée en fait un objet de type "S4" (classe définition)
#.__C__CLASS, dans .GlobalEnv ou, si namespace, dans le namespace.
#attributes(S4) contient nombreuses infos sur la définition de la CLASS.
setClass(Class, #Register une CLASS
representation,prototype
|contains)
#Renvoie un FUNC, wrapper de new(CLASS,...), à nommer en général CLASS.
new(CLASS_STR,...) #Renvoie une CLASS avec les slots ayant leur valeur par défaut, ou celle indiquée par ...
representation
([VAR=]STR...) #Renvoie une LIST de classes STR de slots VAR
prototype([VAR=]VAL...) #Renvoie un CLASSPROTOTYPEDEF, définissant des valeur par défaut VAL de slots VAR :
# - @object S4 : la @.Data est la VAL (vide si pas spécifié), et les named slots sont mis en attributs
# - @slots STRv : slot names (VAR=...)
# - @dataPart : TRUE s'il y a une @.Data
as(VAL,CLASS_STR) et is(VAL,CLASS_STR) ???
setMethod(FUNC_STR,CLASS_ARGSv,FUNC) pour définir FUNC_STR.CLASS_ARGSv[1](CLASS_ARGSv[-1]) <- FUNC ???
NAMESPACE ==> #Noté namespace::membre