2016-08-27 30 views
6
DESCRIPTION tập tin

My package 's có httr trong chỉ thị nhập khẩu của nó:Làm thế nào để ghi đè lên chức năng xuất khẩu từ gói R liệt kê trong Nhập khẩu

Imports: 
    httr (>= 1.1.0), 
    jsonlite, 
    rstudioapi 

httrexports an S3method cho length.path.

S3method(length,path) 

Và nó defined as:

#' @export 
length.path <- function(x) file.info(x)$size 

Trong gói của tôi, tôi có các đối tượng mà tôi gán lớp "con đường" để. Mỗi lần tôi gán lớp "con đường" đối với bất kỳ đối tượng, bất kể có hay không mà tôi từng gọi length() trên đối tượng, điều này được in để stdout:

Error in file.info(x) : invalid filename argument 

Dưới đây là một số mã tái sản xuất tất cả mọi người có thể chạy:

> sessionInfo() 
R version 3.3.1 (2016-06-21) 
Platform: x86_64-apple-darwin13.4.0 (64-bit) 
Running under: OS X 10.11.5 (El Capitan) 

locale: 
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

loaded via a namespace (and not attached): 
[1] tools_3.3.1 

> thing = 1:5 
> class(thing) = 'path' 

> requireNamespace('httr') 
Loading required namespace: httr 

> sessionInfo() 
R version 3.3.1 (2016-06-21) 
Platform: x86_64-apple-darwin13.4.0 (64-bit) 
Running under: OS X 10.11.5 (El Capitan) 

locale: 
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

loaded via a namespace (and not attached): 
[1] httr_1.2.1 R6_2.1.2 tools_3.3.1 

> thing = 1:5 
> class(thing) = 'path' 
Error in file.info(x) : invalid filename argument 

tôi đã cố gắng bắt nó trong một try nhưng điều đó không làm việc:

set_class = function(obj, c) { 
    class(obj) = c 
    return(obj) 
} 

thing = 1:5 
thing = try(set_class(thing, 'path'), silent=TRUE) 

Sản lượng:

Error in file.info(x) : invalid filename argument 

Tôi đã thử assignInNamespace để ghi đè lên các chức năng:

base_length = function(obj) { 
    return(base::length(obj)) 
} 

assignInNamespace('length.path', base_length, 'httr') 
thing = 1:5 
class(thing) = 'path' 

Nhưng tôi nhận được Error: evaluation nested too deeply: infinite recursion/options(expressions=)?

Khi tôi sử dụng httr chức năng trong gói của tôi, tôi sử dụng chúng với httr::function vì vậy tôi không chắc chắn cách chức năng length.path này bị rò rỉ vào không gian tên của tôi và ghi đè hàm chiều dài cơ sở. Tôi cũng đã thử rõ ràng @importFrom httr function cho mỗi chức năng mà tôi sử dụng thay vì sử dụng httr::function nhưng điều đó không hoạt động.

Tôi cũng thấy điều này:

https://support.bioconductor.org/p/79059/

Nhưng giải pháp dường như là để chỉnh sửa mã nguồn của httr, mà tôi không thể làm được kể từ khi gói hàng nhập khẩu của tôi nó. Làm sao để tôi có được xung quanh này?

+1

Nếu 'length()' là một generic, thì bạn muốn gọi 'base :: length.default()' để lấy phương thức mặc định. – Thomas

+0

Vấn đề là tôi không bao giờ gọi chiều dài. Điều này xảy ra khi tôi gọi class (obj) = 'path' –

+0

Tôi nghĩ 'class (obj) = 'path'' chỉ đưa ra một lỗi trong RStudio hoặc các IDE tương tự, nơi bạn có thể nhìn thấy đầu ra của' str (...) 'cho biến không gian làm việc của bạn mọi lúc. Khi bạn gán một lớp mới, IDE sẽ cập nhật mô tả này và gọi 'length' trong tiến trình. Trong "bình thường" RGui lỗi không xảy ra. – AEF

Trả lời

1

Một khả năng có thể là tạo một hàm length.path() trong gói của riêng bạn. Nếu loại cơ sở của path -objects của bạn là tương thích với base::length() bạn có thể chỉ unclass nó để tránh đệ quy vô hạn:

length.path <- function(x) length(unclass(x)) 

Tuy nhiên, điều này là có khả năng chậm so với một cuộc gọi trực tiếp đến base::length() vì nó sao chép các đối tượng và nhu cầu phương thức gửi hai lần.

+0

Hmm, có vẻ như không hoạt động. Đã thêm nguyên văn đó vào gói của tôi và vẫn thấy lỗi xuất phát. Tôi có cần xuất nó không? Loại cơ sở của đối tượng đường dẫn của tôi là một danh sách, vì vậy tôi nghĩ rằng nó sẽ hoạt động tốt. –

+0

Bạn có chắc là lỗi được tạo bởi 'Nhập: httr' trong tệp DESCRIPTION? Tôi chỉ cố gắng tạo một gói giả để nhập khẩu httr và chỉ chứa một hàm trả về một đối tượng của lớp 'đường dẫn'. Làm tất cả mọi việc. Chỉ khi tôi gọi 'thư viện (httr)' sau khi tải gói giả, lỗi phát sinh. – AEF

+0

Nó dường như không xảy ra cho đến khi tôi sử dụng một hàm trong gói của tôi sử dụng 'httr'. Vì vậy, nếu tôi thư viện (RNeo4j) và sau đó sessionInfo(), 'httr' không gian tên không được tải, nhưng ngay sau khi tôi sử dụng một hàm từ gói của tôi sử dụng' httr :: func' trong nội bộ, tôi thấy 'httr' trong sessionInfo(). Và đó là khi tôi có thể tạo lại lỗi file.info. –

0

Giải pháp cho tôi là thêm một hàm .onLoad. Cảm ơn AEF's answer cho ý tưởng unclass.

#' @importFrom utils assignInNamespace 
.onLoad = function(libname, pkgname) { 
    length.path = function(obj) { 
    return(length(unclass(obj))) 
    } 

    assignInNamespace('length.path', length.path, 'httr') 
} 

Nó đặt ra NOTE trong R CMD check --as-cran nhưng tôi hy vọng sẽ tránh được điều đó.

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