如何为R中的子集提供正确的上下文

时间:2014-01-11 09:38:45

标签: r subset evaluation

我想知道什么是使子集理解每个变量的上下文的正确方法。例如,请考虑以下功能:

> f <- function(num) {
  subset(mtcars, carb == num)
}
> f(2)
                   mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Merc 240D         24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
Merc 230          22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
Honda Civic       30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
Dodge Challenger  15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
AMC Javelin       15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
Pontiac Firebird  19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
Porsche 914-2     26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
Lotus Europa      30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
Volvo 142E        21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

现在,考虑f的参数名称也恰好是碳水化合物的情况:

> f <- function(carb) {
  subset(mtcars, carb == carb)
}
> f(2)
                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
..............

这显然不起作用。想知道解决这个问题的正确方法是什么。我本以期望以下工作,但事实并非如此。有人可以详细说明吗?

> f <- function(carb, env=parent.frame()) {
+   subset(mtcars, carb == eval(substitute(carb), env))
+ }

提前致谢

1 个答案:

答案 0 :(得分:0)

这适合我。

carb <- 2
mtcars[mtcars$carb == carb, ]

                   mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Merc 240D         24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
Merc 230          22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
Honda Civic       30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
Dodge Challenger  15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
AMC Javelin       15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
Pontiac Firebird  19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
Porsche 914-2     26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
Lotus Europa      30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
Volvo 142E        21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

或者

x <- 2
with(mtcars, mtcars[carb == x, ]) # same output as above