2009-11-17 2 views
4

Supposons que vous essayez de créer une trame de données dans une fonction. J'aimerais pouvoir définir les noms des colonnes à l'avance comme l'un des paramètres de la fonction. Prenez le code suivant:Spécification des noms de colonne d'une trame de données dans une fonction à l'avance

foo <- function(a) { 
    answer <- data.frame(a=1:5) 
    return(answer) 
    } 

Dans l'exemple ci-dessus, je voudrais être en mesure de préciser la valeur du nom de la colonne dans la fonction foo(), par exemple foo('my.name') de sorte que la réponse a le nom de colonne my.name au lieu de a. J'imagine que vous pourriez le coder dans la fonction en utilisant colnames(), mais je me suis intéressé à une approche alternative.

+1

Je ne peux pas penser à rien de plus simple que d'utiliser 'colnames (réponse) <- à la fin a' de foo. Si vous avez les noms en tant que noms dans une liste, vous pouvez utiliser 'as.data.frame (list (a = 1, b = 2, c = 3))'. Pouvez-vous clarifier pourquoi colnames vous semble maladroit dans votre cas particulier? – Harlan

+0

Supposons bien que la trame de données a plusieurs colonnes. Dans ce cas, vous auriez besoin d'écrire quelque chose de plus impliqué comme 'colnames (réponse) [colnames (réponse) == 'a'] <- 'foo'' Je m'intéressais principalement à une alternative à l'écriture explicite qui serait peut-être impliquer quelque chose lié à 'substitute()'. – andrewj

+1

Il pourrait être plus utile si vous donniez un exemple concret de ce que vous essayez d'accomplir, et peut-être décrivez un peu votre idée d'utiliser substitute() – geoffjentry

Répondre

7

L'utilisation de colnames est le seul moyen que je connaisse pour un data.frame, bien que colnames() soit lui-même un vecteur donc il n'est pas nécessaire de faire des itérations dessus. Cela gère la version deux colonnes:

foo <- function(cname) { 
    answer <- data.frame(1:5, 1:5) 
    colnames(answer) <- cname 
    return(answer) 
} 
> foo(c("a","b")) 
    a b 
1 1 1 
2 2 2 
3 3 3 
4 4 4 
5 5 5 
4

est ici une alternative à l'aide substitute et eval.

foo <- function(var) { 
    eval(substitute(data.frame(var = 1:5)), list(var = as.name(var))) 
} 

J'espère que vous serez d'accord que la solution colnames est plus simple.

1

Un ajustement mineur au code de Shane, au cas où vous voulez vraiment utiliser substitute, ou vous ne pouvez vraiment pas être dérangé pour taper les citations supplémentaires.

foo <- function(a) { 
    answer <- data.frame(1:5) 
    colnames(answer) <- as.character(substitute(a)) 
    answer 
} 
foo(mycolname) 

    mycolname 
1   1 
2   2 
3   3 
4   4 
5   5 
1

La fonction setNames suffit:

> foo <- function(a,nm) { 
+  answer <- data.frame(a=1:5) 
+  setNames(answer, nm) 
+  } 
> foo(1:10, 'bar') 
    bar 
1 1 
2 2 
3 3 
4 4 
5 5