2013-08-29 31 views
12

Tôi đang phát triển gói có chức năng forecast.myclass. Tôi muốn chức năng đó hoạt động tốt với gói forecast. I E. khi gói forecast được tải mã forecast(object) nên gọi forecast.myclass từ gói của tôi.Cách mở rộng phương thức S3 từ gói khác mà không tải gói

Vì tôi chỉ cần định nghĩa chung của forecast từ gói forecast và tôi không sử dụng bất kỳ chức năng nào khác từ gói forecast Tôi không muốn đưa nó vào Phụ thuộc. Vì vậy, tôi xác định chung trong gói của tôi theo cách sau:

##' 
##' @export 
forecast <- function(object,...) UseMethod("forecast") 

##' @rdname forecast.midas_r 
##' @method forecast midas_r 
##' @export 
forecast.midas_r <- function(object,newdata=NULL,method=c("static","dynamic"),insample=get_estimation_sample(object),...) { 

Bây giờ mọi thứ hoạt động như mong đợi khi gói forecast không được tải. Nhưng khi tôi tải gói forecast, thì forecast.midas_r không được gọi, khi thực hiện forecast(object) trong đó object thuộc loại midas_r. Tôi nên giải quyết vấn đề này như thế nào?

+1

Trừ khi bạn đang ghi tài liệu 'forecast.midas_r' (bạn không), bạn chỉ cần' @ S3method (forcast, midas_r) '- sẽ không tạo tệp Rd, nhưng sẽ thêm dòng đúng vào NAMESPACE (đó là nơi đầu tiên để xem nếu bạn đang gặp sự cố) – hadley

+0

@hadley Tôi ghi lại dự báo.midas_r theo cách dự báo và dự báo.midas_r chia sẻ cùng một trang trợ giúp. Mã có tại đây: https://github.com/mpiktas/midasr/blob/master/R/midas_r_methods.R, bắt đầu tại dòng 279 – mpiktas

Trả lời

4

Vấn đề ở đây là định nghĩa của bạn về forecast chung là che giấu định nghĩa khỏi gói dự báo và phương pháp của bạn được liên kết với gói chung chung hơn là gói dự báo chung chung; đây chỉ là một ví dụ phức tạp của hai gói xác định các hàm có cùng tên. Giải pháp là cắn đạn và Phụ thuộc: vào dự báo hoặc khi ở dòng lệnh và cả gói và dự báo của bạn được đính kèm đầy đủ chức năng mypackage::forecast() hoặc Nhập: dự báo nhưng không đưa ra dự báo chung cho người dùng cuối trừ có chúng require(forecast) (điều này có thể phù hợp nếu chức năng forecast bằng cách nào đó ngoại vi với gói của bạn, ví dụ: vẽ đồ thị 3D khi vẽ đồ hoạ trong 2D là đủ).

Đối với giá trị của nó, phương pháp S4 trong PkgB được xác định và xuất khẩu trên S4 được nhập khẩu chung từ PkgA hiển thị rõ ràng S4 chung cho người dùng, vì vậy chung có sẵn ngay cả khi Nhập: PkgA được chỉ định trong tệp DESCRIPTION PkgB.

3

Một giải pháp khả thi là xuất một cách mạnh mẽ dự báo.midas_r. Điều này có nghĩa là cập nhật thủ công NAMESPACE với export(forecast.midas_r) mọi lúc sau check("yourpackagename").

Điều này làm cho forecast.midas_r hiển thị đối với gói dự báo. Nếu forecast.midas_r không được xuất và chỉ tồn tại trong không gian tên của gói, thì khi gói dự báo được tải, thì forecast chung sẽ bị ghi đè bằng hàm giống hệt từ gói dự báo. Vì vậy, khi forecast được gọi trên đối tượng không xác định, R tìm kiếm các phương thức tương ứng trong gói dự báo và trong không gian làm việc chung. Kể từ forecast.midas_r là một phương pháp riêng R không tìm thấy nó và tạo ra một lỗi.

Đây không phải là giải pháp hoàn hảo vì bạn cần phải cập nhật thủ công NAMESPACE, nhưng đó vẫn là một giải pháp.

7

Tôi không chắc có giải pháp dễ dàng nào cho việc này. Như những người khác đã nói rằng nó có thể dễ dàng nhất để sử dụng Depends để có được khoảng này, hơn là xác định lại một phương pháp chung chung.

Đây là một ví dụ đơn giản phù hợp với tôi. Phần lớn nó giống như giải pháp của bạn, nhưng tuyên bố @export có nghĩa là bạn sẽ không cần cập nhật tệp NAMESPACE theo cách thủ công.

##' @name mean 
##' @export mean.newClass 
##' 
##' @method mean newClass 
##' 
##' @title mean for \code{newClass} object 
##' @param x A \code{newClass} object 
##' @param ... Additional arguments 
##' 
mean.newClass <- function(x, ...){ 
    stopifnot(class(x)=="newClass") 
    return(42) 
} 

Sau đó package.skeleton("newPkg"). Đặt tập tin mean.R với các nội dung trên trong thư mục /R của gói.

Đảm bảo bạn đang ở cấp độ thư mục 1 dưới đây, sau đó

roxygenize("newPkg", roxygen.dir="newPkg", copy.package=F, unlink.target=F) 

Bây giờ

library(devtools) 
dev_mode(on=TRUE) ### don't want to have to uninstall the package later 
install_local("newPkg") 
library(newPkg) 
x <- c(1,2) 
class(x) <- "newClass" 
stopifnot(mean(x)==42) 
stopifnot(mean(unclass(x))==1.5) 

Tôi nhận ra mean là một chức năng trong base nhưng tôi đã thử nghiệm này giúp chỉnh sửa các chức năng chung ở nơi khác đến cung cấp cho họ một phương pháp mới, vì vậy nó sẽ mở rộng đến trường hợp tổng quát hơn của bạn.

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