2013-01-13 21 views
9

Bài gửi mới nhất của tôi cho CRAN đã bị trả về vì tôi có bài tập về môi trường toàn cầu hiện đã bị cau mày.Cập nhật dữ liệu được nhúng, ví dụ sysdata.rda

Tôi có tập dữ liệu được nhúng (sysdata.rda) có chứa thông số cấu hình dựa trên trạng thái (như ở Hoa Kỳ) mà người dùng cư trú. Tôi đã muốn tập dữ liệu được nhúng này có thể cập nhật khi người dùng mới sử dụng chương trình. Trước đây tôi đã cập nhật dữ liệu này trong chức năng ban đầu mà người dùng sử dụng và làm cho người dùng có thể truy cập dữ liệu đó thông qua chuyển nhượng toàn cục.

Tôi đang cố gắng tìm ra cách cập nhật dữ liệu được nhúng này và làm cho dữ liệu mặc định mà người dùng sử dụng trong phần còn lại của phiên của họ.

Trước đây tôi đã đặt dữ liệu vào/dữ liệu và gần đây đã chuyển nó sang /R/sysdata.rda vì nó có vẻ phù hợp hơn với ngôn ngữ đó. Bây giờ tôi không chắc lắm.

Bất kỳ sự giúp đỡ rất nhiều đánh giá cao

+0

Bạn có muốn hỏi trạng thái nào sau khi cài đặt trong gói hay mỗi lần tải gói? – hadley

+0

Họ tải gói với dữ liệu được cung cấp của họ và cho biết họ đến từ đâu (ví dụ: TX). Gói nhận ra rằng các thông số cụ thể của tiểu bang không phải là một phần của dữ liệu được nhúng, tính toán chúng tốt nhất có thể và sau đó thêm chúng vào tập dữ liệu được nhúng. Vấn đề tôi đang gặp là sau đó làm cho tập dữ liệu được cập nhật đó có sẵn trong suốt phần còn lại của phiên. Tôi đã từng làm điều đó bằng cách gán nó cho .GlobalEnv. – dbetebenner

Trả lời

4

Điều quan trọng là thực hiện nhiệm vụ trong môi trường khác với môi trường toàn cầu. Có hai kỹ thuật cơ bản, sử dụng local()<<- hoặc tạo ra một cách rõ ràng một môi trường mới:

Làm việc với một môi trường rõ ràng là đơn giản: tạo môi trường và sau đó gán vào nó như một danh sách:

my_opts <- new.env(parent = emptyenv()) 
set_state <- function(value) my_opts$state <- value 
get_state <- function() my_opts$state 

Sử dụng local() là phức tạp hơn một chút, và đòi hỏi một số thủ thuật với <<-

set_state <- NULL 
get_state <- NULL 

local({ 
    state <- NULL 
    get_state <<- function() state 
    set_state <<- function(value) state <<- value 
}) 

Để biết thêm về cách <<- công trình thấy https://github.com/hadley/devtools/wiki/environments, trong phần "Bài tập: gắn kết với giá trị".

+0

Rất hữu ích! Tôi đã đi con đường đầu tiên. Nếu hàm không tìm thấy dữ liệu của nhà nước, nó sẽ tạo ra một môi trường và điền vào nhánh của tiểu bang đó trong dữ liệu được nhúng (một danh sách lớn với một nhánh cho mỗi trạng thái). Dữ liệu cập nhật sau đó được gán cho môi trường mới.Tôi hiện đang chạy afoul của R CMD kiểm tra --as-cran để sử dụng 'đính kèm' để các dữ liệu cập nhật được sử dụng sau khi thoát khỏi chức năng. Tôi không chắc chắn làm thế nào để có được xung quanh rằng – dbetebenner

+0

Thay vì sử dụng 'attach', chỉ cần viết một chức năng truy cập dữ liệu bạn muốn, và gọi đó trong suốt mã của bạn. – hadley

+0

Hmmm. Chắc chắn là tôi đang thiếu gì đó. Dữ liệu (chúng ta hãy gọi nó là 'internal_data') được tăng cường trong một cuộc gọi đến một hàm. Tôi không chắc làm thế nào để có được tăng cường 'internal_data' ra khỏi chức năng đó (Tôi không muốn vượt qua nó trở lại như là một phần của những gì các chức năng trả về vì đó không phải là điểm của chức năng). Giải pháp của người nghèo hiện tại của tôi (qua R CMD check --as-cran là để lưu đối tượng và sau đó tải nó vào .GlobalEnv. – dbetebenner

1

Tại sao không có một tập tin foo.R trong /data mà tải các dữ liệu và cập nhật nó khi người dùng gọi data(foo)? Đây là một trong các tùy chọn cho phép /data, nhưng lưu ý sau đây từ Writing R Extensions

Lưu ý rằng mã R nên “tự cung tự cấp” và không tận dụng chức năng thêm được cung cấp bởi các gói, do đó các tập tin dữ liệu cũng có thể được sử dụng mà không phải tải gói.

Nếu bạn có thể sống với giới hạn đó thì data(foo) có thể tải dữ liệu, cập nhật và đảm bảo rằng nó nằm trong một đối tượng được đặt tên cụ thể mà bạn tham chiếu trong các chức năng của mình.

+0

Không được coi là tệp * .R trong/dữ liệu. Tôi sẽ cho rằng một spin – dbetebenner

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