2016-08-17 6 views
1

Ich möchte Eingaben an setOrder in einer Funktion übergeben. Im Idealfall möchte ich, dass die Funktion einen Datentabellennamen und einen Variablennamen in der Datentabelle annimmt, die Tabelle basierend auf der Variablen neu anordnet und dann einige andere Dinge tut.R So übergeben Sie Eingaben an setOrder in einer Funktion

Hier ist ein Beispiel für das, was ich tun möchte, das nicht funktioniert.

dt <- data.table(replicate(10,sample(0:100,1000,rep=TRUE))) 
sortFunction <- function(dt,var) { 
    v2 <- deparse(substitute(var)) 
    data.table::setorder(dt,v2) 
    return(dt) 
} 

sortFunction(dt, var = "V1") 

Idealerweise würde Ich mag die Funktion haben, zu erkennen, dass eine Zeichenvariable dt eine Datentabelle in der globalen Umwelt ist; d. h., sowohl dt als auch var würden als Zeichenvariablen übergeben und dann als Datentabelle erkannt werden, und

+1

Es ist auch 'setorderv', so dass Sie tun können,' setorderv (dt, "V2") 'und vermeiden Sie den' Deparse (Ersatz (... ' – thelatemail

+0

Dieser Vorschlag löst das erste Problem. Der Code' sortFunction < - Funktion (dt, var) { data.table :: setorderv (dt, var) return (dt) } sortFunction (dt, var = "V2") 'tut, was ich wollte Was den Namen übergeben. der dt in die Funktion anstelle der dt selbst? – JerryN

+1

Ich empfehle es wirklich nicht, aber Sie könnten 'f <- Funktion (dt, var) {tmp <- get (dt, envir = .GlobalEnv); setorderv (tmp, var); tmp} 'oder etwas ähnliches – thelatemail

Antwort

2

Hier ist, was ich getan habe.

  • weiter in die Datentabelle zu übergeben, anstatt versuchen es über get zuzugreifen (dt, envir = .GlobalEnv.

  • Gebrauchte setorderv mit der Datentabelle und die Charakternamen der Spalte , weil setorderv eine Spaltennamen/Spaltennamen als Zeichenvariablen will.

  • Obwohl dies nicht in der Frage, was ich von einigen Graphen war in der Funktion zu tun versuchte. habe ich herausgefunden, wie zu setzen ein se Ries von Plots im Bereich j von die Datentabelle.

Hier ist die vollständige Funktion, wie sie derzeit steht. Ich poste es ohne eine vollständige Erklärung, weil es für mich nützlich gewesen wäre, diesen Code-Ausschnitt zu haben, bevor ich diese Frage gepostet habe.

deltaPlot <- function(dt, var, title, ylabel, regions) { 
    if (missing(regions)) {regions <- 156} 
    dt.temp <- data.table::copy(dt) 
    data.table::setorderv(dt.temp, var) 
    junk <- dt.temp[,{ 
    plot(x = get(var), type = "s", main = title, 
       ylab = ylabel, 
       xlab = "", 
       xaxt = "n", 
       cex.lab = 0.8, mgp = c(2.5, 1, 0), 
       yaxs = "r") 
    abline(h = 0) 
    axis(1, at = 1:regions, labels = region_code.IMPACT159, cex.axis = 0.5)} 
    ] 
} 

Sowohl die Zeichenfolge in var und region_code.IMPACT159 enthalten sind, sind in Spalten dt. Die var-Spalte ist numerisch und region_code.IMPACT159 ist ein Zeichen.

deltaPlot(dt = dt.budgetShare.wide, 
      var = "delta.SSP1", title = "Delta SSP1", 
      ylabel = "Change in IMPACT commodity\nshare of per capita GDP (%)" 
) 

Und der Ausgang. Plot generated by function above

Verwandte Themen