2016-04-20 15 views
0

In R gibt es viele Situationen, in denen with scheint verwendet werden, um Ihnen zu helfen, kürzere Code schreiben; Dies maskiert jedoch vorhandene Symbole wie lokale Variablen und Funktionsparameter. Gibt es eine Möglichkeit, auf sie zu verweisen, ohne sie umzubenennen, damit sie nicht mit Ihren Daten kollidieren?Scoping in R, und Umgang mit "mit"

Zum Beispiel, in diesem Rahmen habe ich eine state Spalte;

df <- data.frame(
    label=c("a", "b", "c"), 
    state=c("off","on","off")) 

kann ich eine Filterfunktion mit einer .state Parameter und der Filterwerke schreiben;

instateWorks <- function(.state) { 
    subset(df, df$state == .state) 
} 

# correct - 1 observation for "b" 
onWorks <- instateWorks("on") 

aber wenn ich gebe meine Funktion eineine sinnvollen Parameternamen, es gibt ein Problem, und das Symbol state scheint den Datenrahmen der Spalte zu beziehen;

instateFails <- function(state) { 
    subset(df, df$state == state) 
} 

# fails - all 3 observations 
onFails <- instateFails("on") 

Gibt es eine Möglichkeit sich zu qualifizieren, dass state soll den Parameter bedeuten, das Skript Arbeit zu machen, wie erwartet?

Bearbeiten - um zu verdeutlichen, warum "mit" und "eval" das Problem sind, mit dem ich Probleme habe, bedenken Sie diesen Code;

df <- data.frame(
    label=c("a", "b", "c"), 
    state=c("off","on","off")) 

with(df, state == "on") 
# FALSE TRUE FALSE 

state <- on 
with(df, state == state) 
# TRUE TRUE TRUE 

In der letzten with Aussage, ich bin auf der Suche nach einem Weg, auszudrücken ‚mir sagen, welche Zeilen die haben‚Staat‘Variable in DF hat den gleichen Wert wie der‚auf der Linie definierten Zustand‘Variable oben .

Ohne diese Fähigkeit kann ich eine Funktion nicht mit einem Parameter schreiben, der dasselbe heißt wie der Name einer Spalte.

+1

Verwendung dieses anstelle von Teilmenge: instateFails <- function (state) df [df $ state == Zustand] – chinsoon12

+1

Von 'help (Teilmenge)' - * Warnung Dies ist eine Komfortfunktion interaktiv zur bestimmungsgemäßen Verwendung. Für die Programmierung ist es besser, die Standard-Subsetting-Funktionen wie '[' 'zu verwenden, und insbesondere die nicht standardisierte Auswertung der Argument-Teilmenge kann unerwartete Konsequenzen haben. * –

+0

Ich benutze nur Teilmenge, weil sie das Problem mit' mit 'veranschaulicht. Das gleiche Problem tritt zB bei dplyr auf, wo ich nicht 'filter (df, state == state)' sagen kann. Es ist ein generelles Problem bei der Übergabe von Ausdrücken an Funktionen, die in einer anderen Umgebung als der aufrufenden Funktion "evaluieren". –

Antwort

1

Dank @ HaddE.Nuff, kam ich auf diese Idee;

erfassen Sie die aktuelle Umgebung, bevor Sie den Anruf tätigen, wodurch Sie auf alle Ortsansässigen in der aufrufenden Funktion verweisen können. Beziehen Sie sich dann auf die Umgebungsvariable im Filterausdruck.

Verwandte Themen