2012-04-22 26 views
13

Trong R, có thể có phần mềm bỏ qua thực tế là có các đối số không được sử dụng được xác định khi một mô-đun được chạy không? Ví dụ: Tôi có mô-đun multiply(a,b), trả về sản phẩm ab. Tôi sẽ nhận được một lỗi nếu tôi gọi là mô-đun như vậy:Đối số không được sử dụng trong R

multiply(a=20,b=30,c=10) 

Việc trả lại lỗi về vấn đề này chỉ có vẻ hơi không cần thiết, vì các đầu vào cần thiết ab đã được chỉ định. Có thể tránh hành vi xấu này không?

Một giải pháp dễ dàng là chỉ dừng xác định c, nhưng điều đó không trả lời tại sao R hoạt động như thế này. Có cách nào khác để giải quyết vấn đề này không?

+1

Để trả lời "Trả lại lỗi này có vẻ hơi không cần thiết", tôi không nghĩ điều này là không cần thiết, vì bạn rõ ràng đang mong đợi một cái gì đó cho việc gán đối số bổ sung mà bạn cần được thông báo rằng đối số không tồn tại để ngăn chặn "hành vi bất ngờ" của hàm. –

+0

Đầu tiên, đó là một chức năng không phải là một mô-đun. Thứ hai, làm thế nào để chức năng của bạn biết phải làm gì với các đối số bổ sung? Tôi nghĩ câu trả lời là đúng, nhưng nó phải minh họa hơn về cách người ta thực sự sử dụng các dấu chấm (hay còn gọi là "..."). – geneorama

Trả lời

23

Thay đổi định nghĩa của nhân để có lập luận thêm biết:

multiply <- function(a, b, ...) { 
    # Original code 
} 
7

Một cách tiếp cận (mà tôi không thể tưởng tượng là thực hành lập trình tốt) được thêm ... mà theo truyền thống được sử dụng để vượt qua đối số quy định tại một chức năng khác.

> multiply <- function(a,b) a*b 
> multiply(a = 2,b = 4,c = 8) 
Error in multiply(a = 2, b = 4, c = 8) : unused argument(s) (c = 8) 
> multiply2 <- function(a,b,...) a*b 
> multiply2(a = 2,b = 4,c = 8) 
[1] 8 

Bạn có thể đọc thêm về ... được thiết kế để được sử dụng here

+0

Tại sao bạn nghĩ rằng điều này sẽ là thực tế xấu? (Không đồng ý, chỉ tò mò.) Tôi cảm thấy như tôi đã đọc rất nhiều tài liệu R trong đó đối số '...' chỉ đơn giản là bị bỏ qua, điều này gợi ý rằng mọi người làm điều này theo thời gian. – joran

+0

... được thiết kế để chuyển tới các hàm phụ, đặc biệt là các phương thức, trong đó danh sách các đối số được yêu cầu (hoặc được chấp nhận) không được biết tại thời điểm hàm được viết. Nếu bạn vượt qua ... xuống dưới, bạn sẽ gặp lỗi "đối số không được sử dụng" ở mức độ sâu hơn. Nói chung, không biết bạn đang hoặc đang không sử dụng một đối số dẫn đến nhầm lẫn. –

+0

Và nó chỉ đánh tôi rằng tôi làm điều này thường đủ với các phương pháp ảo C++. Danh sách đối số là tất nhiên cố định, nhưng một số phương pháp đối tượng không cần tất cả các đối số. –

5

Bạn có thể sử dụng dấu chấm: ... trong định nghĩa chức năng của bạn.

myfun <- function(a, b, ...){ 
    cat(a,b) 
} 

myfun(a=4,b=7,hello=3) 

# 4 7 
0

Tôi gặp vấn đề tương tự như bạn. Tôi đã có một danh sách dài các đối số, hầu hết đều không liên quan. Tôi không muốn mã hóa chúng khó khăn. Đây là những gì tôi đã đưa ra với

library(magrittr) 
do_func_ignore_things <- function(data, what){ 
    acceptable_args <- data[names(data) %in% (formals(what) %>% names)] 
    do.call(what, acceptable_args %>% as.list) 
} 

do_func_ignore_things(c(n = 3, hello = 12, mean = -10), "rnorm") 
# -9.230675 -10.503509 -10.927077 
Các vấn đề liên quan