2013-10-09 32 views
18

J'ai vu la fonction lapply utilisée dans R pour extraire des éléments de matrices qui existent dans une liste de matrices.L'utilisation de '[' crochet comme une fonction pour lapplication dans R

E.g. J'ai une liste de 3 matrices (2x2), et je veux extraire l'élément [1,2] de chacune de ces 3 matrices. Le code list1 = lapply(mylist, '[', 1,2) fonctionne très bien. Il retourne une liste avec ces 3 éléments. J'essaie de rechercher ce que cela fait exactement. Google n'a pas aidé et en utilisant ?'[' dans l'aide R n'est pas trop explicatif. Je ne vois pas comment '[' est une fonction dans R, donc le code n'est pas intuitif.

+0

connexes: http://stackoverflow.com/questions/10449366/levels-what-sorcery-is-this –

+3

Comme d'autres l'ont souligné, '[' est certainement une fonction . Il y a aussi des fonctions d'assignation (par exemple: '[<-') qui interviennent quand vous utilisez les nombreuses variations sur' <-' (comme le remarque @ AriB.Friedman dans ce lien). Par exemple, essayez quelque chose comme ces 2 commandes: 'x <- 1: 5; "[<-" (x, 1,10); ' – thelatemail

+3

** Tout ** dans R est un objet ... et si * fait * quelque chose, alors le type d'objet est fonction. – Gregor

Répondre

19

Les opérateurs de R ne sont que des fonctions.

Ce sont équivalentes:

> x <- list(a=1,b=2) 
> x[1] 
$a 
[1] 1 

> `[`(x,1) 
$a 
[1] 1 

Les accents graves ne sont nécessaires pour empêcher l'interprétation par l'analyseur (par exemple pour le dire, il est un nom de fonction ne pas commencer à interpréter le [ prématurément).

Étant une fonction, elle suit les mêmes règles orientées objet (dans ce cas, S3) que tout le reste.

> methods(`[`) 
[1] [.acf*    [.arrow*   [.AsIs    [.bibentry*  [.cluster*   [.data.frame  [.data.table*  
[8] [.Date    [.difftime   [.envlist*   [.factor   [.formula*   [.fractions*  [.getAnywhere*  
[15] [.gList*   [.gpar*   [.gtable*   [.hexmode   [.idf*    [.indexed*   [.insensitive*  
[22] [.ITime*   [.listof   [.noquote   [.numeric_version [.octmode   [.pdf_doc*   [.person*   
[29] [.POSIXct   [.POSIXlt   [.quoted*   [.raster*   [.roman*   [.shingle*   [.simple.list  
[36] [.split*   [.terms*   [.trellis*   [.ts*    [.tskernel*  [.uneval*   [.unit*   
[43] [.unit.arithmetic* [.unit.list*  [.vpPath*   

    Non-visible functions are asterisked 

+, =, etc., et d'autres opérateurs tout le travail de cette façon aussi.

+2

Belle explication - pour donner un exemple des 'autres opérateurs', '"/"(1,2)' et '1/2' et' do.call ("/", liste (1,2)) 'tout donne le même résultat. – thelatemail

+1

En ce qui concerne les fonctions marquées d'un astérisque, voir [Comment afficher le code source d'une fonction?] (Http://stackoverflow.com/a/19226817/1191259) – Frank

+2

@thelatemail En base, il y a 'Reduce ('/', liste (1,2)) ',' Map ('/', 1,2) 'et tous les' apply's qui prennent des fonctions comme arguments, aussi, et peut-être plus (?) ... – Frank

27

Les crochets sont en fait une fonction dont le premier argument est l'objet en cours de sous-ensemble. Les arguments suivants sont l'index de ce sous-ensemble.

# For example, if M is a matrix 
M[1, 2] # extracts the element at row 1, col 2 
# is the same as 
`[`(M, 1, 2) 
# Try them! 

Maintenant, regardez les arguments lapply:

args(lapply) 
# function (X, FUN, ...) 

Tout représenté dans ces points est transmis à la fonction FUN comme arguments.

Ainsi, lorsque FUN="[", le premier argument à "[" est l'élément en cours de la liste (étant itéré), c'est-à-dire, l'objet en cours de sous-ensemble. Bien que les arguments suivants sont les indices à "["

Questions connexes