2013-04-09 30 views
7

Có cách nào để nhận các tham số chức năng từ bên trong một hàm không?Nhận danh sách tất cả các tham số chức năng từ bên trong hàm

match.call() không trả về các tham số có cài đặt mặc định nhưng không bị ghi đè. Ví dụ:

xf <- function (a, b="Hi", c=TRUE) { 
    print(as.list(match.call(expand.dots=FALSE))) 
} 

>xf(3) 
[[1]] 
xf 

$a 
[1] 3 

Tôi đang viết gói có chức năng gọi hàm hiện có nhưng tôi muốn có thể đặt mặc định không có chức năng hiện tại. (Tôi đã lên kế hoạch về việc sử dụng danh sách từ match.call, đi qua nó vào chức năng khác với do.call và gửi lại kết quả

Cập nhật:.. Một vấn đề thú vị có liên quan đến phương pháp S3 Tôi tạo ra một phương pháp S3 mới, và sử dụng Câu trả lời của @ Ferdinand.kraft as.list(environment(), all.names=TRUE) Đối số all.names giữ các tên bắt đầu bằng một số . trong danh sách, hóa ra phương thức công văn thêm một số đối số vào môi trường hàm, bao gồm .Generic.Method và một số đối tượng khác. một trong những câu trả lời khác có thể là giải pháp tốt hơn, nhưng tôi thích sự đơn giản của as.list(environment()).

+0

làm 'arg s' làm những gì bạn muốn? –

Trả lời

10

Bạn cũng có thể trả lại môi trường vào đầu của hàm:

xf <- function (a, b="Hi", c=TRUE) { 
    as.list(environment(), all=TRUE) 
} 

Kết quả:

> xf(a=1) 
$a 
[1] 1 

$b 
[1] "Hi" 

$c 
[1] TRUE 
+0

Tôi thích sự đơn giản. – Seth

+0

Tôi cũng thế. :-) Và nó có thể trở nên đơn giản hơn nếu không có tên đối số nào bắt đầu bằng dấu chấm - hoặc nếu bạn không muốn truyền chúng theo - trong trường hợp đó bạn có thể bỏ tham số 'all = TRUE'. –

4

Bạn có thể sử dụng lsmget. ls sẽ (theo mặc định), liệt kê các đối tượng trong khung gọi (trong trường hợp này, bên trong hàm), mget sẽ nhận các đối tượng này.

ví dụ

xf <- function(a,b='Hi',c){ 
    # this gets the current definitions of `a`, `b`, and `c` 
    incall <-mget(ls()) 
    incall} 

xf(3) 
## $a 
## [1] 3 
## 
## $b 
## [1] "Hi" 
## 
## $c 

Sau đó, bạn có thể sử dụng do.call(whatever, incall)

+0

Sử dụng tốt mget. – Seth

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