2013-09-21 50 views
8

Tiêu đề không phải là siêu mô tả vì vấn đề dài hơn một tiêu đề hợp lý mà tôi có thể nghĩ là có thể hiển thị.Lấy tên đối tượng từ bên trong một hàm

Tôi muốn có một hàm lấy tên đối tượng từ các hàm khác có thể được sử dụng làm đối số trong hàm khác. Dưới đây là một nỗ lực barebones:

grab <- function(x) { 
    as.character(substitute(x)) 
} 

FUN <- function(foo, bar = grab(foo)) { 
    bar 
} 

FUN(mtcars) 

Ở đây tôi muốn của FUN để trả lại chuỗi ký tự "mtcars" nhưng nó sẽ trả về "foo". Làm thế nào có thể làm cho một chức năng lấy mà thực hiện điều này (tôi muốn làm điều này bởi vì tôi sẽ sử dụng điều này như là mặc định cho một tập tin txt/csv vv.Đó là một thiết lập thuận tiện. nhưng tôi muốn có một hàm lấy generic):

FUN2 <- function(foo, bar = as.character(substitute(bar))) { 
    bar 
} 

FUN2(mtcars) 

#================== 

FUN3 <- function(foo, bar) { 
    if(missing(bar)) bar <- foo 
    as.character(substitute(bar)) 
} 

FUN3(mtcars) 

cuộc sống-ish Bất dụ:

real_example <- function(obj, file = grab(obj)) { 
    write.csv(obj, file = sprintf("%s.csv", file)) 
} 
+0

Hãy chỉnh sửa hoặc chỉnh sửa tiêu đề để làm rõ hơn. –

+0

Câu hỏi này trông rất giống nhau: http://stackoverflow.com/questions/5754367/using-substitute-to-get-argument-name-with – Frank

+0

@ Frank bạn có nhận được bất kỳ phản hồi nào trong số những câu trả lời đó không? –

Trả lời

6

Bạn có thể thử sys.call để có được quyền truy cập vào các cuộc gọi mẹ:

## "which" is the number of the argument of interest 
grab <- function(which) { 
    ## which + 1, because [1] == name of function/call 
    ## and arguments are 2:n 
    as.character(sys.call(-1L)[which+1L]) 
} 

FUN <- function(foo, bar = grab(1L)) { 
    bar 
} 

FUN(mtcars) 
# "mtcars" 
+0

Đây là hành vi tôi đang tìm kiếm. Tôi sẽ giữ kiểm tra như là câu trả lời trong trường hợp những người khác có một lựa chọn tốt hơn (tức là, ai đó chỉ ra một cái gì đó bị lỗi với điều này). –

+0

+1. Đúng vậy, như Tyler nói, nếu không có gì sai khi làm theo cách này (thay vì chuyển tên "mtcars" và sử dụng 'get'), tôi cũng có thể sử dụng nó. – Frank

6

Làm thế nào về điều này?

grab <- function(x) as.character(x[["foo"]]) 
FUN <- function(foo, bar=grab(match.call())) { bar } 

FUN(mtcars) 
# [1] "mtcars" 
+0

Điều này cũng hoạt động. +1 –

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