2015-04-19 16 views
7

Tôi có một lớp container về cơ bản là một danh sách. Bởi vì tôi muốn hỗ trợ subsetting, tôi đã quá tải các subset [ nhà điều hành (có khả năng kém triển khai thực hiện).Quá tải của nhà điều hành ngừng hoạt động trong gói R

#' Constructor for spectra object 
.spectra = function(n_spectrum = 0) { 
    object  = vector(mode = "list", n_spectrum) 
    class(object) = "spectra" 
    return(object) 
} 

#' Operator overload 
#' @export 
`[.spectra` = function(x, i) { 
    x = unclass(x) 
    x = x[i]     # Using the list's subset function 
    class(x) = "spectra" 
    return(x)     # Should return a "spectra" object, not a list 
} 

Bây giờ, điều này hoạt động như mong đợi khi trong môi trường phát triển của tôi (khi tôi gỡ lỗi gói). Tức là, nếu y_old là đối tượng spectra và tôi làm y_new = y_old[-1], y_new vẫn là đối tượng spectra.

Tuy nhiên, khi tôi biên soạn dự án dưới dạng gói và cài đặt nó, toán tử subsetting trả về list thay vì đối tượng spectra.

Bất kỳ đầu mối nào về những gì đang diễn ra?

EDIT

tôi quên đề cập đến mà tôi đang sử dụng RStudio và devtools thư viện.

+2

Bạn có dòng có 'S3method (" [", spectra)' trong tệp 'NAMESPACE' của gói của bạn không? – nicola

+0

@nicola No. ** Chỉ ** dòng tôi có trong 'NAMESPACE' là' exportPattern ("^ [[: alpha:]] +") ', mà tôi đoán là những gì RStudio đặt trong đó. – dudu

+0

Đặt dòng đó, xây dựng lại gói và xem nó có hoạt động hay không. – nicola

Trả lời

0

Sự cố này tóm tắt việc khởi tạo mặc định của RStudio NAMESPACE khi bạn chọn tạo gói. Kiểm tra tệp NAMESPACE hiển thị:

exportPattern("^[[:alpha:]]+") 

Không khớp với toán tử tập hợp con [, như MrFlick đã chỉ ra.

Bạn có thể thêm tên vào NAMESPACE theo cách thủ công hoặc bạn có thể yêu cầu RStudio và Roxygen thực hiện công việc cho bạn. Trong RStudio 0.99.902 bạn sẽ:

  1. install.packages("roxygen2")
  2. Kiểm tra Tạo tài liệu với Roxygen trong menu Xây dựng>Configure Build cụ>Công cụ xây dựng.
  3. Nhấp vào nút Định cấu hình và chọn hộp kiểm NAMESPACE.

Bây giờ bạn rõ ràng là phải bổ sung tài liệu Roxygen chức năng của bạn và nhớ để sử dụng thẻ @export, ví dụ .:

#' Print hi in R 
#' @export 
print_hi = function(x) print("hi") 

Sau khi xây dựng bạn nên có một tập tin NAMESPACE tạo tự động. Ví dụ:

# Generated by roxygen2: do not edit by hand 

export(print_hi) 
Các vấn đề liên quan