2016-07-10 28 views
2

Ich muss einen Datenrahmen von einer Funktion erstellen, die einen anderen Datenrahmennamen eingibt und die Daten neu gestaltet. Das Problem tritt auf, wenn ich die Ausgabe nach einer Umwandlung des Namens der Eingabetabelle benennen muss. Mein Code so weit ist:R- innerhalb einer Funktion zuweisen

tablaXYZ<-data.frame(a=seq(1,2,1), 'X1'=seq(2,3,1), 'X2'=seq(3,4,1)) 
rownames(tablaXYZ)<-c('X1', 'X2') 

Und die Funktion I worte ist:

creaMelts<-function(tbl){ 
    library(reshape2) 
    texto<-deparse(substitute(tbl)) 
    tbl2<-melt(tbl, id.vars=rownames(tbl)) 
    texto2<-substr(texto,4,nchar(texto)) 
    colnames(tbl2)<-c('userId','movieId', texto2) 
    tblName<<-paste0('df', texto2) 
    print(paste('tblName', tblName, ' ')) 
    assign(tblName, tbl2) 
    return(assign(tblName, tbl2)) 
} 

Wenn ich laufen:

creaMelts(tablaXYZ) 

ich:

"tblName dflaXYZ " 

So , wenn man bedenkt, dass "assign" funktioniert in dem Objekt in dem 2. Platz mit den in dem Objekt in dem 1. Platz gespeichert Namen gegeben, wie:

`m<-'hola'` 
assign(m, tablaXYZ) 

Und dann habe ich für m fragen, erhalte ich:

"hola" 

Aber wenn ich frage für „hola“ ich erhalte die Tabelle:

hola 
    a X1 X2 
X1 1 2 3 
X2 2 3 4 

ich dachte, ich würde einen Datenrahmen „dflaXYZ“ mit den Werten benannt haben:

userId movieId laXYZ NA 
1  2  3  a 1 
2  3  4  a 2 

Aber wenn ich laufe:

dflaXYZ 

ich nur bekommen:

"dflaXYZ" 

und wenn ich zum Beispiel laufen:

a<-creaMelts(tablaXYZ) 

Und dann "a" fragen, ich die gewünschte Tabelle.

userId movieId laXYZ NA 
1  2  3  a 1 
2  3  4  a 2 

Ich brauche den gleichen Tisch zu bekommen, aber in diesem Fall dflaXYZ (Streichung die ersten drei Buchstaben und das Hinzufügen von df mit dem Eingangstabellennamen) genannt.

Antwort

0

Wir müssen verwenden envir Argument für die assign Zugriff auf die Umgebung außerhalb der Funktion.

creaMelts<-function(tbl){ 
    library(reshape2) 
    texto<-deparse(substitute(tbl)) 
    tbl2<-melt(tbl, id.vars=rownames(tbl)) 
    texto2<-substr(texto,4,nchar(texto)) 
    colnames(tbl2)<-c('userId','movieId', texto2) 
    tblName<<-paste0('df', texto2) 
    print(paste('tblName', tblName, ' ')) 
    assign(tblName, tbl2, envir = parent.frame()) 

} 

creaMelts(tablaXYZ) 
dflaXYZ 
# userId movieId laXYZ NA 
#1  2  3  a 1 
#2  3  4  a 2 
+0

Danke, aber da ich es in einer Liste von Tabellen verwenden müssen, ich versuche mit obj <-lapply (lista, creaMelts), wo lista = list (tbl1, tbl2, ...) und es ist funktioniert nicht. Weißt du, warum es nicht möglich ist, diese Funktion in einer Schleife zu verwenden? Soll ich eine andere Frage dazu schreiben? Vielen Dank. – GabyLP

+1

@GabyLP Anstelle von 'parent.frame' benutzen' .GlobalEnv', da das 'lapply' eine andere Umgebung ist, die das parent.frame der Funktion ist. – akrun

+0

Immer noch Probleme. Dieser Teil: texto <-deparse (substitute (tbl)) druckt "X [[i]]", also bekomme ich keine Tabelle. – GabyLP

Verwandte Themen