2012-05-08 28 views
11

Nếu tôi cần sử dụng tập dữ liệu bên trong một hàm (như bảng tra cứu) bên trong gói tôi đang tạo, tôi có cần tải rõ ràng bộ dữ liệu bên trong của hàm không?Dữ liệu bên trong một chức năng (tạo gói)

Hàm và tập dữ liệu đều là một phần của gói của tôi.

Đây có phải là cách chính xác để sử dụng dữ liệu thiết lập bên trong hàm:

foo <- function(x){ 
    x <- dataset_in_question 
} 

hoặc là này tốt hơn:

foo <- function(x){ 
    x <- data(dataset_in_question) 
} 

hoặc là có một số cách tiếp cận tôi không nghĩ đến việc đó là đúng ?

+0

Mhh ... Tôi sẽ sử dụng hàm áp dụng trong hàm thay vào đó và sử dụng hàm trên tập dữ liệu, nhưng có lẽ đây không phải là một tùy chọn trong trường hợp này ... – Mikko

+0

Tôi gần như chắc chắn tùy chọn đó (1) . AFAIK, bạn sử dụng 'data()' cho các tác dụng phụ của nó, không phải là giá trị trả về của nó. Trong thực tế, giá trị trả về của 'data()' chỉ đơn giản là tên của tập dữ liệu, không phải là biến thực tế. Hãy thử, ví dụ, 'x <- dữ liệu (iris)' và xem những gì sẽ xảy ra. – Andrie

+0

Nếu bạn chỉ sử dụng tập dữ liệu làm bảng tra cứu và không thay đổi nó, có cần phải tạo một đối tượng giống hệt mới không? Nếu có nhu cầu, bạn có thể xem xét việc thêm bảng làm đối số chính thức cho hàm của bạn ('x = dataset_in_question'). – BenBarnes

Trả lời

1

Một chỉ có thể đặt các dữ liệu thiết lập như là một tập tin trong thư mục .rda R như được mô tả bởi Hadley tại đây: http://r-pkgs.had.co.nz/data.html#data-sysdata

Matthew Jockers sử dụng phương pháp này trong syuzhet pa ckage cho bộ dữ liệu bao gồm các bing dữ liệu thiết lập như là nhìn thấy ở ~ dòng 452 ở đây: https://github.com/mjockers/syuzhet/blob/master/R/syuzhet.R

bing không có sẵn cho người sử dụng nhưng là để gói như chứng minh bởi: syuzhet:::bing

Về cơ bản, lệnh devtools::use_data(..., internal = TRUE) sẽ thiết lập mọi thứ theo cách cần thiết.

+0

use_data hiện không được chấp nhận – jzadra

+1

@jzadra no biggie vừa được chuyển sang gói ** usethis ** dưới dạng 'usethis :: use_data' –

11

Đã có sự recent discussion về chủ đề này (trong bối cảnh phát triển gói) trên R-devel, nhiều điểm trong đó có liên quan đến câu hỏi này:

  1. Nếu chỉ các tùy chọn mà bạn cung cấp được áp dụng cho Ví dụ bạn R mình (ví dụ, Brian Ripley) cho bạn biết phải làm:

    foo <- function(x){ 
        data("dataset_in_question") 
    } 
    
  2. cách tiếp cận này sẽ tuy nhiên ném một LƯU Ý trong R CMD séc có thể tránh được trong các phiên bản sắp tới của R (hoặc hiện R devel) bằng cách sử dụng t ông globalVariables() chức năng, added by John Chambers

  3. Các 'đúng' cách tiếp cận (ví dụ, một trong những chủ trương của Brian RipleyPeter Dalgaard) sẽ được sử dụng tùy chọn LazyData cho gói của bạn. Xem this section of "Writing R Extensions".

Btw: Tôi không hiểu rõ cách tiếp cận đầu tiên của bạn sẽ hoạt động như thế nào. Điều gì nên x <- dataset_in_question làm gì? dataset_in_question Biến toàn cục hay được xác định trước đó?

1

Đối với tôi nó là cần thiết để sử dụng get() thêm cho LazyData: true trong DESCRIPTION tập tin (xem postig bởi @Henrik điểm 3) để thoát khỏi các LƯU Ý no visible binding for global variable .... Phiên bản R của tôi là 3.2.3.

foo <- function(x){ 
    get("dataset_in_question") 
} 

Vì vậy LazyData làm dataset_in_question truy cập trực tiếp (không sử dụng data("dataset_in_question", envir = environment())) và get() là để đáp ứng R CMD check

HTH

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