2012-05-09 32 views
84

Tôi đang tìm kiếm sự đảo ngược của get().Trong R, cách lấy tên của đối tượng sau khi nó được gửi đến một hàm?

Đặ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ụ nhỏ với foo là trình giữ chỗ cho hà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, đó là khó khăn hơn để thực hiệ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") 
+20

Tôi nghĩ 'deparse (thay thế (...)) 'là những gì bạn đang theo sau – Chase

+2

Ví dụ xấu mặc dù có biến được gọi là" z "và tham số để 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 đã làm điều đó một cách chính xác sau đó ;-) – Tommy

+0

@Tommy, cố gắng cải thiện nó, nhưng hãy cải thiện với chỉnh sửa nếu bạn muốn. –

Trả lời

104

Các deparse-thay thế cũ lừa:

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 các câu mới t-object

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 chuyển đến lapply (và nó cũng không thành công khi một đối tượng được chuyển từ danh sách được gán cho một for vòng). có thể trích xuất thuộc tính .Names và thứ tự xử lý từ kết quả cấu trúc, nếu nó là một vector có tên đã đượ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]]" 
2

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

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 nhận xét khác tôi đã thấy trên diễn đàn cho thấy hành vi cuối cùng là không thể tránh khỏi. Điều này là không may nếu bạn đang viết phương pháp in cho các gói.

+0

Có lẽ nó nên là: 'print.foo = function (x) {cat (deparse (thay thế (x)))}' hoặc 'print.foo = function (x) {print (deparse (thay thế (x)), trích dẫn = FALSE)} ' –

+0

Hoặc' print.foo = function (x) {print.default (as.list (x))} ' –

1
deparse(quote(var)) 

sự hiểu biết trực giác của tôi Trong đó đoạn trích đóng băng var hoặc biểu hiện từ việc đánh giá và chức năng deparse đó là nghịch đảo của hàm phân tích cú pháp làm cho rằng biểu tượng đóng băng trở lại chuỗi

Các vấn đề liên quan