2015-12-08 12 views
9

Tôi đang cố sửa đổi các dấu chấm (...) bên trong một hàm tùy chỉnh. Dưới đây là ví dụ đơn giản về hàm plot2 của tôi, hiển thị âm mưu trên màn hình với type="p" (mặc định) và tiết kiệm một svg với type="l". Vấn đề hiển thị khi một trong các tùy chọn lô đất ... đã có trong chức năng. Trong ví dụ này, "type" được đối sánh bởi nhiều đối số thực tế.Sửa đổi dấu chấm (...) bên trong một hàm

plot2 <-function(...){ 
plot(...) #visible on screen 

svg("c:/temp/out.svg") #saved to file 
plot(...,type="l") 
dev.off() 
} 

#This works 
plot2(1:10) 
#This does not work because type is redefined 
plot2(1:10, type="o") 

Tôi đã cố gắng để đưa các dấu chấm trong một list bên trong hàm và sửa đổi nó, nhưng plot không chấp nhận một danh sách như một đầu vào.

#Does not work 
plot2 <-function(...){ 
plot(...) 

dots <<-list(...) 
print(dots) 
if("type" %in% names(dots)) dots$type="l" 
print(dots) 

svg("c:/temp/out.svg") 
plot(dots) 
dev.off() 
} 
plot2(1:10, type="o") 
Error in xy.coords(x, y, xlabel, ylabel, log) : 
    'x' is a list, but does not have components 'x' and 'y' 

Trả lời

12

Trong trường hợp bạn muốn chuyển tiếp một phiên bản sửa đổi của ..., bạn cần phải làm hai việc:

  1. Capture các dấu chấm
  2. Forward các dấu chấm chụp qua do.call.

này hoạt động như sau:

plot2 = function (...) { 
    # capture: 
    dots = list(...) 

    # modify: 
    dots$type = 'l' 

    # forward call: 
    do.call(plot, dots) 
} 

Nói chung, do.call(f, list(‹…›)) tương đương với f(‹…›).

+0

Cảm ơn bạn. Đơn giản và hiệu quả. –

1

Đối với những gì bạn muốn, có một cách đơn giản (và tốt hơn) và bạn không cần phải chạm vào .... Bằng cách xác định rõ ràng các đối số cần điều trị đặc biệt, bạn lấy chúng ra khỏi phần bắt tất cả .... Đây cũng là một cách tiếp cận lành mạnh rõ ràng hơn về chức năng của nó (trong các đối số chính thức của nó). Dưới đây là cách thực hiện:

plot2 <- function(x, type = "p", ...) { 
    plot(x, type = type, ...) #visible on screen 

    svg("out.svg") #saved to file 
    plot(x, ..., type = "l") 
    dev.off() 
} 

plot2(1:10) 
plot2(1:10, type = "o") 
+0

Ví dụ tôi cung cấp được đơn giản hóa và giải pháp của bạn sẽ không được tối ưu với các chức năng thực tế của tôi. Trong ví dụ thực tế của tôi, hàm 'plot' là một hàm lô tùy chỉnh với gần 50 đối số. Hàm 'plot2' chỉ là một trình bao bọc để hiển thị cốt truyện và lưu nó theo một vài định dạng. –

+0

Xin lỗi, nhưng nó vẫn hoạt động. Nó không phải là tất cả các đối số có thể được chuyển đến ..., nhưng chỉ vài đối số bạn đang thao tác theo cách đặc biệt trong hàm của bạn mà phải được loại bỏ một cách rõ ràng ... –

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