2017-04-13 6 views
0

Kann mir jemand sagen, warum die Verwendung von eval(parse(text=xxxx)) schlägt fehl, wenn es zwischen einem von mehreren Datenrahmen zur Ausgabe als die Rückkehr aus einer FunktionR Eval Problem mit der Funktion Rückkehr

zum Beispiel zur Auswahl verwendet wird Ich habe drei Datenrahmen innerhalb einer Funktion erzeugt;

aaa.df, bbb.df, ccc.df

und ein 'Modus' -Parameter z.B. aaa/bbb/ccc (die in diesem Fall zeigt die Datenrahmen aus der Funktion zurück)

die folgenden zwei-liner funktioniert

eval(parse(text=paste("output.df<-",mode,".df", sep=""))) 
return(output.df) 

jedoch bei dem Versuch, diese beiden Zeilen rein für eine kondensieren etwas knapper, die Zwischenzuordnung zu output.df entfernend, wird der Datenrahmen nicht ausgegeben

z

eval(parse(text=paste("return(",mode,".df)", sep=""))) 

Es wird keine große Sache für mich, mit dem ersten Ansatz fortzusetzen, bis ich mit einem sehr großen Datenrahmen am Ende zurück, an welcher Stelle ich es annehmen könnte einiger Performance/Speicher-Hit.

+0

Es ist schwer zu sagen, weil Sie nicht genug bereitgestellt haben, damit wir Ihr Problem neu erstellen können. Aber hast du versucht, Klammern um deinen ganzen Ausdruck zu legen? '(eval (parse (text = einfügen (" return (", mode,". df) ", sep =" "))))' – Jake

+0

Habe das nicht versucht tbh. Ich hätte gedacht (obwohl Sie jetzt vorschlagen, dass ich weniger zuversichtlich bin), dass das Umbrechen eines ganzen Ausdrucks in Klammern wie dieser absolut keinen Einfluss auf die Codeausführung hätte. Aber es gibt vielleicht eine Facette der R-Syntax, die ich hier verpasst habe ... – Pascoe

+0

Es gibt sicherlich viel bessere Möglichkeiten, um zu wählen, welcher data.frame von einer Funktion zurückkehren soll. 'eval (parse())' ist normalerweise eine schlechte Idee im R-Code. Selbst ein einfaches 'get()' wäre hier wahrscheinlich besser. – MrFlick

Antwort

2

Entfernen Sie einfach die return, es ist völlig unnötig und ehrlich gesagt überhaupt nicht sinnvoll.

eval(parse(text=paste0(mode,".df"))) 

Noch besser wäre es, nicht eval hier nicht verwenden - es ist wahrscheinlich die schlechteste Lösung. Platzieren Sie Ihre Daten stattdessen in einem strukturierten Tabellen- oder Listenformat. Oder schlimmsten Fall verwenden get:

get(paste0(mode, '.df')) 

Aber wirklich, setzen Sie einfach die Daten in eine benannte Liste.

+0

Das Entfernen der Rückgabe scheint in der Evaluierungsstruktur nicht zu funktionieren. Jedoch return (get ... funktioniert. Also danke für das. Upvoting. Cheers ... – Pascoe

+0

Und +1 für paste0 auch ... Ich kann aufhören zu verwenden sep = "" - auch geschätzt – Pascoe

+1

@Pascoe Ja, Entfernen 'zurück 'tut nichts * seit' return' selbst tut nichts *. Wie ich schon sagte, es ist nur nutzlos. Übrigens ist es * auch * unnötig, wenn es zusammen mit 'get' verwendet wird, es sei denn, Sie möchten die Funktion vorzeitig beenden. –