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

wfsdck30  于 2023-04-27  发布在  其他
关注(0)|答案(4)|浏览(139)

我在找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")
rqcrx0a6

rqcrx0a61#

古老的替代方法:

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-循环时也会失败)。如果它是一个正在处理的命名向量,您可以从结构结果中提取“.Names”属性和处理顺序。

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

w8f9ii692#

deparse(quote(var))

我的直观理解是,引号冻结了求值中的var或表达式,而parse函数是parse函数的反函数,它使冻结的符号返回到String
一些新的评论
替换和引用的区别:

f <- function(x) {
  substitute(x)
}

g = function(x){
  quote(x)
}

第二个函数将始终返回x(quote函数作为参数获取的值),而第一个函数将返回传递给该函数的对象,尝试以下操作:

f(z~x+y) # return you z~x+y
g(z~x+y) # return you x
uelo1irk

uelo1irk3#

请注意,对于print方法,行为可以不同。

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

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

kwvwclae

kwvwclae4#

以下是Eli Holmes的回答:

  1. myfunc工作得很好
    1.我很想在另一个函数中调用它(在他8月15日,20日的评论中讨论过)
    1.失败
    1.函数中,直接编码(而不是从外部函数调用),deparse(substitute()技巧工作得很好。
    1.这一切都隐含在他的回答中,但为了我这种健忘程度的偷窥者的利益,我想把它拼出来。
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"

相关问题