在R中,如何获得一个对象的名字后,它被发送到一个函数?

我正在寻找get()的反向。

给定一个对象的名字,我希望有一个string代表直接从对象中提取的对象。

foo是我正在寻找的函数的占位符的简单例子。

 z <- data.frame(x=1:10, y=1:10) test <- function(a){ mean.x <- mean(a$x) print(foo(a)) return(mean.x)} test(z) 

将打印:

  "z" 

我目前面临的难题是:

 test <- function(a="z"){ mean.x <- mean(get(a)$x) print(a) return(mean.x)} test("z") 

老的替补伎俩:

 a<-data.frame(x=1:10,y=1:10) test<-function(z){ mean.x<-mean(z$x) nm <-deparse(substitute(z)) print(nm) return(mean.x)} test(a) #[1] "a" ... this is the side-effect of the print() call # ... you could have done something useful with that character value #[1] 5.5 ... this is the result of the function call 

编辑:与新的testing对象一起运行

注意:当一组列表项被传递给lapply时,这将不会在一个本地函数内部成功(当一个对象从给定的for -loop列表中传递时,它也会失败)。您将能够提取.Names属性和结构的处理顺序,如果它是正在处理的已命名向量。

 > lapply( list(a=4,b=5), function(x) {nm <- deparse(substitute(x)); strsplit(nm, '\\[')} ) $a $a[[1]] [1] "X" "" "1L]]" $b $b[[1]] [1] "X" "" "2L]]" > lapply( c(a=4,b=5), function(x) {nm <- deparse(substitute(x)); strsplit(nm, '\\[')} ) $a $a[[1]] [1] "structure(c(4, 5), .Names = c(\"a\", \"b\"))" "" [3] "1L]]" $b $b[[1]] [1] "structure(c(4, 5), .Names = c(\"a\", \"b\"))" "" [3] "2L]]" 

请注意,对于打印方法,行为可能会有所不同。

 print.foo=function(x){ print(deparse(substitute(x))) } test = list(a=1, b=2) class(test)="foo" #this shows "test" as expected print(test) #this shows #"structure(list(a = 1, b = 2), .Names = c(\"a\", \"b\"), class = \"foo\")" test 

我在论坛上看到的其他评论意味着最后的行为是不可避免的。 这是不幸的,如果你正在写封装的打印方法。