46 votes

Que signifient les opérateurs %op% dans le texte ? Par exemple "%in%" ?

J'ai essayé de faire cette recherche simple mais je n'ai rien trouvé sur le pourcentage ( % ) dans R.

Qu'est-ce que %in% signifie-t-il dans le code suivant ?

time(x) %in% time(y)x y y sont des matrices.

Comment puis-je trouver de l'aide sur %in% et fonctions similaires qui suivent le %stuff% car je ne parviens pas à localiser le fichier d'aide ?

Questions connexes :

57voto

BondedDust Points 105234

Je ne pensais pas que les réponses de GSee ou de Sathish allaient assez loin parce que "%" fait a une signification en soi et pas seulement dans le contexte de la %in% opérateur. Il s'agit du mécanisme permettant aux utilisateurs de définir de nouveaux opérateurs infixes. Il s'agit d'une question beaucoup plus générale que les vertus de l'opérateur de type %in% opérateur infixe ou son ancêtre préfixe plus général match . Cela pourrait être aussi simple que de faire un opérateur "s"(um) par paire :

 `%s%` <- function(x,y) x + y

Ou cela pourrait être plus intéressant, par exemple faire un opérateur de dérivation seconde :

 `%DD%` <- function(expr, nam="x") { D(D( bquote(.(expr)), nam), nam) }
 expression(x^4) %DD% "x"
 # 4 * (3 * x^2)

Le site % -a également une importance dans l'analyse syntaxique des fonctions de date, de date-heure et de format de type C comme strptime , formatC y sprintf .

Depuis que ce texte a été écrit, nous avons assisté à l'émergence de la magrittr avec le dplyr élaboration qui démontre encore une autre utilisation de % -opérateurs flanqués.

La réponse la plus générale est donc que % sont traités de manière spéciale par l'analyseur syntaxique R. Puisque l'analyseur syntaxique est utilisé pour traiter les expressions plotmath, vous verrez également des options étendues pour les annotations graphiques au niveau de l'option ?plotmath page d'aide.

37voto

Richie Cotton Points 35365

%op% désigne un infixe opérateur binaire . Il existe plusieurs opérateurs intégrés utilisant % et vous pouvez également créer votre propre site.

(Un seul % n'est pas un mot-clé dans R. Vous pouvez voir une liste de mots-clés sur le site Web de la société ?Reserved page d'aide).


Comment obtenir de l'aide sur les opérateurs binaires ?

Comme pour tout ce qui n'est pas un nom de variable standard, vous devez mettre le terme entre guillemets ou entre guillemets inversés.

?"%in%"
?`%in%`    

Crédit : La réponse de GSee .


Qu'est-ce que %in% faire ?

Comme décrit sur le ?`%in%` (qui est en fait la page d'aide ?match page d'aide depuis %in% n'est en fait qu'une version infixe de match .),

[ %in% ] renvoie un vecteur logique indiquant s'il y a une correspondance ou non pour son opérande gauche

Il est le plus souvent utilisé avec des variables catégorielles, bien qu'il puisse également être utilisé avec des nombres.

c("a", "A") %in% letters
## [1]  TRUE FALSE

1:4 %in% c(2, 3, 5, 7, 11)
## [1] FALSE  TRUE  TRUE FALSE

Crédit : La réponse de GSee , Réponse d'Ari , La réponse de Sathish .


Comment créer mes propres opérateurs binaires infixes ?

Il s'agit de fonctions, qui peuvent être définies de la même manière que n'importe quelle autre fonction, à quelques restrictions près.

  1. C'est un binaire la fonction doit donc prendre exactement deux arguments.
  2. Le nom n'étant pas standard, il doit être écrit avec des guillemets ou des apostrophes.

Par exemple, ceci définit un opérateur de puissance matriciel.

`%^%` <- function(x, y) matrixcalc::matrix.power(x, y)

matrix(1:4, 2) %^% 3

Crédit : La réponse de BondedDust , Réponse d'Ari .


Quels autres % y a-t-il des opérateurs ?

Sur base R :

%/% y %% effectuer division de nombres entiers y division modulaire respectivement, et sont décrites sur la page ?Arithmetic page d'aide.

%o% donne le produit extérieur de tableaux.

%*% réalise multiplication matricielle .

%x% effectue le produit de Kronecker de tableaux.

Sur ggplot2 :

%+% remplace le cadre de données dans un ggplot.

%+replace% modifie les éléments du thème dans un ggplot.

%inside% (interne) vérifie les valeurs dans une plage.

%||% (interne) fournit une valeur par défaut en cas de NULL valeurs. Cette fonction apparaît également en interne dans devtools, reshape2, roxygen2 et knitr. (Dans knitr, elle est appelée %n% .)

Sur magrittr :

%>% transforme le côté gauche en une expression du côté droit.

%<>% pipe le côté gauche dans une expression du côté droit, puis réaffecte le résultat dans l'objet du côté gauche.

%T>% transforme le côté gauche en une expression sur le côté droit, qu'il utilise uniquement pour ses effets secondaires, en retournant le côté gauche.

%,% construit une séquence fonctionnelle.

%$% expose les colonnes d'un data.frame ou les membres d'une liste.

Sur table.de.données :

%between% vérifie les valeurs dans une plage.

%chin% c'est comme %in% optimisé pour les vecteurs de caractères.

%like% vérifie les correspondances entre les expressions régulières.

Sur Hmisc :

%nin% renvoie l'opposé de %in% .

Sur devtools :

%:::% (interne) obtient une variable à partir d'un espace de nom passé comme une chaîne.

Sur sp :

%over% effectue une jointure spatiale (par exemple, quel polygone correspond à certains points ?)

Sur rébus :

%R% concatène les éléments d'un regex objet.


Plus généralement, vous pouvez trouver tous les opérateurs dans tous les paquets installés sur votre machine en utilisant :

library(magrittr)

ip <- installed.packages() %>% rownames
(ops <- setNames(ip, ip) %>% 
  lapply(
    function(pkg)
    {
      rdx_file <- system.file("R", paste0(pkg, ".rdx"), package = pkg)
      if(file.exists(rdx_file))
      {
        rdx <- readRDS(rdx_file)
        fn_names <- names(rdx$variables)
        fn_names[grepl("^%", fn_names)]
      }
    }
  ) %>% 
  unlist
)

31voto

GSee Points 19079

Mettez des guillemets pour trouver la page d'aide. L'un ou l'autre fonctionne

> help("%in%")
> ?"%in%"

Une fois que vous aurez atteint la page d'aide, vous verrez que

La définition actuelle de "%in%" est la suivante

'"%in%" <- function(x, table) match(x, table, nomatch = 0) > 0'


Desde time est un générique, je ne sais pas ce qu'il faut faire. time(X2) retours sans savoir ce que X2 est. Mais, %in% vous indique quels éléments de la partie gauche se trouvent également dans la partie droite.

> c(1:5) %in% c(3:8)
[1] FALSE FALSE  TRUE  TRUE  TRUE

Voir aussi, intersect

> intersect(c(1:5), c(3:8))
[1] 3 4 5

21voto

Ari B. Friedman Points 24940

Plus généralement, %foo% est la syntaxe d'un opérateur binaire. Les opérateurs binaires dans R ne sont en fait que des fonctions déguisées, et prennent deux arguments (celui qui précède et celui qui suit l'opérateur deviennent les deux premiers arguments de la fonction).

Par exemple :

> `%in%`(1:5,4:6)
[1] FALSE FALSE FALSE  TRUE  TRUE

Alors que %in% est définie dans la base R, vous pouvez également définir votre propre fonction binaire :

`%hi%` <- function(x,y) cat(x,y,"\n")
> "oh" %hi% "my"
oh my

2voto

Sathish Points 462

%in% est un opérateur utilisé pour trouver et sous-ensembler les occurrences multiples du même nom ou de la même valeur dans une matrice ou un cadre de données.

Par exemple 1 : sous-ensemble avec le même nom

set.seed(133)
x <- runif(5)
names(x) <- letters[1:5]
x[c("a", "d")]
#  a         d 
#  0.5360112 0.4231022

Maintenant, vous changez le nom de "d" en "a".

 names(x)[4] <- "a"

Si vous essayez d'extraire les noms similaires et leurs valeurs en utilisant l'indice précédent, cela ne fonctionnera pas. Remarquez le résultat, il ne contient pas les éléments de [1] et [4].

x[c("a", "a")]

#        a         a 
#    0.5360112 0.5360112 

Donc, vous pouvez extraire les deux "a" de différentes positions dans une variable en utilisant %in% opérateur binaire.

names(x) %in% "a"
#  [1]  TRUE FALSE FALSE  TRUE FALSE

#assign it to a variable called "vec"
 vec <- names(x) %in% "a"

#extract the values of two "a"s
 x[vec]
 #         a         a 
 #  0.5360112 0.4231022 

Exemple 2 : Sous-ensemble de plusieurs valeurs d'une colonne Voir ce site pour un exemple

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X