2016-04-01 6 views
1

ich den Inhalt und Namen übergeben data.frame auf Funktion wie folgt zu erreichen:den Namen der Variablen in der Funktion erhalten, unabhängig davon, ob sie direkt übergeben oder über * an

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

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

Ich habe Liste der Daten .frames und ich muss diese Funktion für jeden data.frame aus dieser Liste aufrufen. Es gibt mehrere Möglichkeiten, es zu tun, erwähnt in meinem vorherigen question, zB:

> 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" 

Dieser ist zu arbeiten, weil ich die Namen bin vorbei direkt zu funktionieren, und wenn ich den Inhalt data.frame innen zugreifen möchten Funktion kann ich LoDFs[[x]] verwenden. Kann ich eine Art von Funktion schreiben, die den Namen von data.frame erhalten kann, unabhängig davon, ob sie direkt übergeben wurde (1. Beispiel) oder lapply aus Liste (2. Beispiel) verwendet?

PS: Ich dachte, wenn es irgendwie möglich wäre, die "Eltern" -Funktion zu bestimmen, und wenn dieser Elternteil wäre *apply dann werde ich anders damit umgehen, aber ich weiß nicht, ob das richtige Ansatz ist.

EDIT In Antwort auf G. Grothen

Ok, also habe ich neu geschrieben my.func1 zu

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

Beispiel davon für jede data.frame aus der Liste Aufruf mit mapply:

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

Beispiel für den direkten Aufruf:

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

Es ist ein weiterer Parameter, aber scheint, dass es funktioniert (Ich bin nicht 100% sicher, ob as.character(substitute(mtcars)) richtig ist).

Antwort

3

Wenn LoDFs in einem lapply verwendet der Name verloren, aber mapply kann verwendet werden, um sowohl die Namen und Werte weitergeben müssen:

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

Ja, kann dies geschehen:

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() 

Direkt Argument:

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 

Benannte Liste Dereferenz:

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 

Named Liste anwenden:

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

danken Ihnen sehr, zeigt dies für mich sehr interessante Sprache Einbauten, die ich plane, bald zu studieren. –

Verwandte Themen