在 R 中,如何在对象被发送到函数后获取对象的名称?

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

给定一个对象名称,我希望能够直接从对象中提取表示该对象的字符串。

一个简单的例子,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")
69080 次浏览

老把戏:

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

编辑: 使用新的测试对象运行它

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

> lapply( list(a=4,b=5), function(x) {nm <- deparse(substitute(x)); strsplit(nm, '\\[')} )
$a      # This "a" and the next one in the print output are put in after processing
$a[[1]]
[1] "X"    ""     "1L]]"  # Notice that there was no "a"




$b
$b[[1]]
[1] "X"    ""     "2L]]"


> lapply( c(a=4,b=5), function(x) {nm <- deparse(substitute(x)); strsplit(nm, '\\[')} )
$a
$a[[1]]   # but it's theoretically possible to extract when its an atomic vector
[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 (just typing 'test' on the R command line)
test
#shows
#"structure(list(a = 1, b = 2), .Names = c(\"a\", \"b\"), class = \"foo\")"

我在论坛上看到的其他评论表明,最后一种行为是不可避免的。如果您正在为包编写打印方法,那么这是不幸的。

deparse(quote(var))

我的直觉 其中引号冻结计算中的变量或表达式 而 parse 函数是 parse 函数的逆函数,它使得被冻结的符号返回 String

详细阐述伊莱 · 霍姆斯的回答:

  1. myfunc运行良好
  2. 我很想在另一个函数中调用它(正如他在8月15日的“20评论”中所讨论的)
  3. 失败
  4. 在直接编码(而不是从外部函数调用)的函数中,deparse(substitute()技巧运行良好。
  5. 这些都隐含在他的回答中,但是为了便于偷窥,以我的健忘程度,我想把它说出来。
an_object <- mtcars
myfunc <- function(x) deparse(substitute(x))


myfunc(an_object)
#> [1] "an_object"


# called within another function
wrapper <- function(x){
myfunc(x)
}


wrapper(an_object)
#> [1] "x"

我只是想提供一些澄清,因为如果对象通过管道连接到函数中,接受的解决方案将不能正常工作。相反,名称将是“.我花了好久才想明白。因此,在 IRTFM 的上述答案中,test(a)工作,而不是 a %>% test()。应该是一个评论,但仍然建立我的声誉。