Zugriff auf ‚Daten‘ Argument mit () Funktion?
Frage
Ist es möglich, in dem expr
Ausdruck der with()
Funktion, der Zugriff auf das data
Argument direkt? Hier ist, was ich meine konzeptuell:
> print(df)
result qid f1 f2 f3
1 -1 1 0.0000 0.1253 0.0000
2 -1 1 0.0098 0.0000 0.0000
3 1 1 0.0000 0.0000 0.1941
4 -1 2 0.0000 0.2863 0.0948
5 1 2 0.0000 0.0000 0.0000
6 1 2 0.0000 0.7282 0.9087
> with(df, subset(.data, select=f1:f3)) # Doesn't work
Natürlich obigen Beispiel ist irgendwie albern, aber es wäre für Dinge wie diese praktisch sein:
with(subset(df, f2>0), foo(qid, vars=subset(.data, select=f1:f3)))
Ich habe versucht, mit environment()
herumzustochern und parent.frame()
usw., aber er kommen mit nichts arbeitete.
Vielleicht ist das wirklich eine Frage zu eval()
, denn das ist, wie with.default()
umgesetzt wird.
Lösung
Mit parent.frame()
:
# sample data:
set.seed(2436502)
dfrm <- data.frame(x1 = rnorm(100), x2 = rnorm(100), g1 = sample(letters, 100, TRUE))
# how to use it:
with(subset(dfrm, x1<0), {
str(parent.frame(2)$data)
"Hello!"
})
# 'data.frame': 47 obs. of 3 variables:
# $ x1: num -0.836 -0.343 -0.341 -1.044 -0.665 ...
# $ x2: num 0.362 0.727 0.62 -0.178 -1.538 ...
# $ g1: Factor w/ 26 levels "a","b","c","d",..: 11 4 15 19 8 13 22 15 15 23 ...
Wie die Magie funktioniert
Mit ls()
Sie können parent.frames
überprüfen:
with(subset(dfrm, x1<0), {
print(ls())
print(ls(parent.frame(1)))
print(ls(parent.frame(2)))
print(ls(parent.frame(3)))
})
# [1] "g1" "x1" "x2"
# [1] "enclos" "envir" "expr"
# [1] "data" "expr"
# [1] "dfrm"
Wie Sie sehen können:
-
parent.frame(3)
ist Basisumgebung (in diesem Fall), -
parent.frame(2)
ist Umgebungsubset
Funktion -
parent.frame(1)
ist Umgebung von{
-Funktion (siehe?Paren
)
Andere Tipps
Ich neige dazu, es zu invertieren, das heißt die with()
außen setzen und subset()
Arbeit auf seine Daten haben:
R> data(mtcars)
R> with(subset(mtcars, gear==4), lm(mpg ~ wt)) # no data arg
Call:
lm(formula = mpg ~ wt)
Coefficients:
(Intercept) wt
42.49 -6.86
Dies ist auch ein dummes Beispiel, weil lm(mpg ~ wt, data=mtcars, subset=gear==4)
offensichtlich macht das gleiche, aber Sie bekommen die Drift.