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.

War es hilfreich?

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 Umgebung subset 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top