Trong R, làm thế nào để có được tên của một đối tượng sau khi nó được gửi đến một hàm?


134

Tôi đang tìm kiếm sự đảo ngược của get().

Đặt tên đối tượng, tôi muốn có chuỗi ký tự đại diện cho đối tượng đó được trích xuất trực tiếp từ đối tượng.

Ví dụ tầm thường với fooviệc giữ chỗ cho chức năng mà tôi đang tìm kiếm.

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)

Sẽ in:

  "z"

Công việc của tôi xung quanh, khó thực hiện hơn trong vấn đề hiện tại của tôi là:

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

test("z")

34
Tôi nghĩ deparse(substitute(...))là những gì bạn đang theo
đuổi

2
Ví dụ xấu mặc dù có biến gọi là "z" và tham số cần kiểm tra cũng được gọi là "z" ... In "z" không thực sự cho bạn biết nếu bạn đã thực hiện đúng sau đó ;-)
Tommy

@ Mẹ ơi, đã cố gắng cải thiện nó, nhưng vui lòng cải thiện bằng chỉnh sửa nếu bạn muốn.
Etienne Low-Décarie

Trái ngược với gettrong R là assignnhưng tôi không chắc đó là thứ bạn thực sự đang tìm kiếm ...
Tom Kelly

Câu trả lời:


158

Thủ thuật thay thế cũ:

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

Chỉnh sửa: Chạy nó với đối tượng thử nghiệm mới

Lưu ý: điều này sẽ không thành công bên trong một hàm cục bộ khi một tập hợp các mục danh sách được truyền từ đối số đầu tiên sang lapply(và nó cũng thất bại khi một đối tượng được truyền từ danh sách được cung cấp cho for-loop.) Bạn có thể trích xuất ".Names" -cung cấp và thứ tự xử lý từ kết quả cấu trúc, nếu đó là một vectơ có tên đang được xử lý.

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

11
deparse(quote(var))

Sự hiểu biết trực quan của tôi Trong đó trích dẫn đóng băng var hoặc biểu thức từ đánh giá và hàm depough là hàm nghịch đảo của hàm parse làm cho biểu tượng bị đóng băng đó trở lại String


5

Lưu ý rằng đối với phương thức in, hành vi có thể khác nhau.

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

Các ý kiến ​​khác tôi đã thấy trên các diễn đàn cho thấy rằng hành vi cuối cùng là không thể tránh khỏi. Điều này thật đáng tiếc nếu bạn đang viết phương pháp in cho các gói.


Có lẽ nó phải là: print.foo=function(x){ cat(deparse(substitute(x))) }hoặcprint.foo=function(x){ print(deparse(substitute(x)), quote=FALSE) }
IRTFM

1
Hoặcprint.foo=function(x){ print.default(as.list(x)) }
IRTFM
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.