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

时间:2012-05-09 17:05:40

标签: 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")

3 个答案:

答案 0 :(得分:135)

旧的解密替代技巧:

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时,这在本地函数内部不会成功(当一个对象从给定的{{1}列表传递时它也会失败循环。)如果它是一个正在处理的命名向量,你将能够从结构结果中提取“.Names”属性和处理顺序。

for

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:4)

deparse(quote(var))

我直观的理解 其中引用冻结了评估中的var或表达式 而解析函数的反函数desarse函数使得冻结符号返回String