2010-06-20 7 views
4

Je voudrais passer une variable à l'opérateur binaire $.

Disons que j'ai cette

> levels(diamonds$cut) 
[1] "Fair"  "Good"  "Very Good" "Premium" "Ideal" 

Je veux faire une fonction qui prend en paramètre le sélecteur pour $

my_helper <- function (my_param) { 
    levels(diamonds$my_param) 
} 

Mais cela ne fonctionne pas

> my_helper(cut) 
NULL 

> my_helper("cut") 
NULL 

Répondre

9

Utilisez [[ au lieu de $. x$y est la main courte pour x[["y"]]. Pourquoi dites-vous qu'il n'a pas accès à l'objet?

my_helper <- function (my_param) { 
    levels(diamond[[my_param]]) 
} 
my_helper("cut") 
1

Vous ne pouvez pas accéder aux composants d'un objet sans avoir accès à l'objet lui-même, c'est pourquoi votre my_helper() échoue.

Il semble que vous soyez un peu confus au sujet des objets R, et je recommande fortement d'avoir des textes d'introduction décents. Certains bons gratuits sur les sites CRAN, et il existe également plusieurs livres décents. Et SO avait un certain nombre de discussions à ce sujet comme par exemple.

+0

Pourquoi dites-vous qu'il n'a pas accès à l'objet? Je suppose que 'diamonds' est dans la portée globale, le problème est que' $ 'n'accepte pas les chaînes. – nico

+0

C'est techniquement correct mais erroné - n'assumez pas la visibilité globale mais rendez vos fonctions d'accesseur explicites. Et toute l'approche est fausse, d'où la nécessité d'une lecture plus approfondie. Si vous le souhaitez, les niveaux 'mylevels <- function (x, y) (x [, y])' devraient fonctionner --- mais il y a plus à apprendre sur les listes, data.frames, ... et quoi utiliser quand. Pp –

+0

Je ne suis pas d'accord dans une certaine mesure - dans certains cas, pendant l'analyse interactive des données (pas la programmation), il peut être utile de définir de petites fonctions auxiliaires reposant sur un ensemble de données fixe prénom. – hadley

1

Essayez quelque chose comme ceci:

dat = data.frame(one=rep(1,10), two=rep(2,10), three=rep(3,10)) 
myvar="one" 
dat[,names(dat)==myvar] 

Cela devrait retourner la première colonne/variable de la trame de données dat

dat$one --> [1] 1 1 1 1 1 1 1 1 1 1 
+0

Vous n'avez pas besoin de 'names (dat) == myvar', passez simplement' myvar '. –

+0

bien sûr vous avez raison - je préfère les exemples redondants pour montrer ce qui se passe vraiment;) – FloE

Questions connexes