2016-04-01 19 views
1

我可以得到如下方式的内容和传递data.frame到函数的名称:得到函数变量的名称,无论是否直接或通过*通过的申请

my.func1 <- function(dframe, ...){ 
    content <- dframe 
    name <- deparse(substitute(dframe)) 
    name 
} 

> my.func1(mtcars) 
[1] "mtcars" 

我有数据列表.frames,我需要从这个列表中为每个data.frame调用这个函数。有几种可能的方式做到这一点,我在以前question提到的,如:

> LoDFs <- list(first=data.frame(y1=c(1,2,3), y2=c(4,5,6)), second=data.frame(yA=c(1,2,3), yB=c(4,5,6))) 
> lapply(names(LoDFs), function(x) { x }) 
[[1]] 
[1] "first" 

[[2]] 
[1] "second" 

这一个是工作,因为我传递的名称,直接发挥作用,当我想访问的data.frame里面的内容功能我可以使用LoDFs[[x]]。我可以编写一种类型的函数,无论是直接传递(第1个例子)还是使用列表中的lapply(第2个例子),都可以获取data.frame的名称?

PS:我在想是否可以以某种方式确定“父”功能,如果这个父母是*apply,那么我将处理它不同,但我不知道这是否是正确的方法。

编辑在回答G.格罗腾迪克

好了,我已经使用mapply重写调用它从列表中每个data.frame的my.func1

my.func1 <- function(dframe.val, dframe.name, ...){ 
    value <- dframe.val 
    name <- dframe.name 
    name 
} 

例子:

mapply(my.func1, LoDFs, names(LoDFs)) 

直接调用它的示例:

my.func1(mtcars, as.character(substitute(mtcars))) 

这是一个参数,但似乎它工作(我不是100%确定as.character(substitute(mtcars))是正确的方式)。

回答

3

如果LoDFs是在lapply名字都丢失,但mapply使用可用于同时通过名称和值:

fun <- function(nm, DF) sprintf("%s has %d rows", nm, nrow(DF)) 
mapply(fun, names(LoDFs), LoDFs) 
1

是的,这是可以做到:

fun <- function(df,...) { 
    call1 <- sys.call(1L); 
    if (grepl(perl=T,'apply$',as.character(call1[[1L]]))) { 
     name <- df; 
     df <- get(envir=sys.frame(-2L),as.character(call1[[2L]][[2L]]))[[name]]; 
    } else { 
     name <- substitute(df); 
     if (length(name)==3L && as.character(name[[1L]])=='$') { 
      name <- as.character(name[[3L]]); 
     } else { 
      name <- deparse(name); 
     }; ## end if 
    }; ## end if 
    print(name); 
    print(df); 
    invisible(); 
}; ## end fun() 

直接参数:

fun(mtcars); 
## [1] "mtcars" 
##      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 
## Hornet 4 Drive  21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 
## Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 
## Valiant    18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 
## Duster 360   14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 
## 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 
## Merc 280   19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 
## Merc 280C   17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4 
## Merc 450SE   16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3 
## Merc 450SL   17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3 
## Merc 450SLC   15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3 
## Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4 
## Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4 
## Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4 
## Fiat 128   32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1 
## Honda Civic   30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2 
## Toyota Corolla  33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1 
## Toyota Corona  21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 
## 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 
## Camaro Z28   13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4 
## Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2 
## Fiat X1-9   27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1 
## 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 
## Ford Pantera L  15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4 
## Ferrari Dino  19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6 
## Maserati Bora  15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8 
## Volvo 142E   21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2 

已命名清除引用:

fun(LoDFs$first); 
## [1] "first" 
## y1 y2 
## 1 1 4 
## 2 2 5 
## 3 3 6 
fun(LoDFs$second); 
## [1] "second" 
## yA yB 
## 1 1 4 
## 2 2 5 
## 3 3 6 

命名列表应用:

invisible(lapply(names(LoDFs),fun)); 
## [1] "first" 
## y1 y2 
## 1 1 4 
## 2 2 5 
## 3 3 6 
## [1] "second" 
## yA yB 
## 1 1 4 
## 2 2 5 
## 3 3 6 
+0

非常感谢你,这说明对我来说很有趣的语言内部,我打算尽快学习。 –

相关问题