2017-03-02 2 views
4

übergeben wurde Ich möchte den Namen eines Datenrahmens, der durch die Pipe übergeben wurde, drucken können. Ist das möglich? Ich kann.Name des Datenrahmens, der durch die Pipe in R

printname <- function(df){ 
    print(paste(substitute(df))) 
} 
printname(mtcars) 
#[1] "mtcars" 

Es gibt jedoch "." wenn diese Funktion über die Leitung magrittr geleitet wird.

mtcars %>% printname 
# [1] "." 

Dies wäre hilfreich, wenn angemeldet Produktionsprozesse verwendeten benutzerdefinierte Fehlermeldungen von Funktionen zu schreiben - es ist schwer zu wissen, wo etwas, wenn das einzige, was im Protokoll ist fehlgeschlagen „“

Es würde wahrscheinlich reichen, den ursprünglichen Anruf zurückzugeben, der das mtcars %>% Stück einschließen würde.

+0

Wie starten Sie eine Pipeline, ohne den Namen des data.frame zu kennen? "bekommen"? Es gibt hier einen fehlenden Kontext. – alistaire

+0

Sie kennen den Namen, wenn Sie den Code schreiben, aber die Funktionen, die Sie über die Pipe aufrufen, kennen den Namen nicht, so dass sie keine informativen Fehler auslösen können. Sie möchten, dass Runtime Assertions Fehler mit dem Namen des Datenrahmens auslösen, der den Fehler verursacht hat. –

+0

Messe. Zeilennummern wären auch nett, jetzt wo ich darüber nachdenke. – alistaire

Antwort

6

Dies ist ein erster Versuch, es ist eine Art Hack, aber es scheint, als könnte es funktionieren.

find_chain_parts <- function() { 
    i <- 1 
    while(!("chain_parts" %in% ls(envir=parent.frame(i))) && i < sys.nframe()) { 
      i <- i+1 
     } 
    parent.frame(i) 
} 

printfirstname <- function(df){ 
    ee <- find_chain_parts() 
    print(deparse(ee$lhs)) 
} 

mtcars %>% printfirstname 
# [1] "mtcars" 

pipe Die Funktion erzeugt eine Umgebung, die den Überblick über die Kettenteile hält. Ich habe versucht, in den aktuellen Ausführungsumgebungen nach dieser Variablen zu suchen und dann die dort gespeicherten Informationen zu verwenden, um das Symbol am Anfang der Pipe zu finden. Dies ist nicht gut getestet.

Verwandte Themen