2014-09-30 14 views
5

Tôi muốn chia sẻ một số phần mềm như một gói nhưng một số tập lệnh của tôi dường như không hoạt động bình thường như các hàm. Ví dụ, xem xét đoạn mã sau đây trong đó 'raw.df' là một khung dữ liệu chứa các biến của cả hai loại rời rạc và liên tục. Các hàm 'count.unique' và 'squash' sẽ được định nghĩa trong gói. Kịch bản chia khung dữ liệu thành hai khung, 'cat.df' được coi là dữ liệu phân loại và 'cts.df' được coi là dữ liệu liên tục.Bao gồm các tập lệnh R trong các gói R

Ý tưởng của tôi về cách thức này sẽ được sử dụng là người dùng sẽ đọc trong khung dữ liệu 'raw.df', nguồn tập lệnh, sau đó tương tác chỉnh sửa 'cat.df' và 'cts.df', có thể kết hợp một số loại và chuyển đổi một số biến.

dcutoff <- 9 
tail(raw.df) 
(nvals <- apply(raw.df, 2, count.unique)) 
p <- dim(raw.df)[2] 
(catvar <- (1:p)[nvals <= dcutoff]) 
p.cat <- length(catvar) 
(ctsvar <- (1:p)[nvals > dcutoff]) 
p.cts <- length(ctsvar) 
cat.df <- raw.df[ ,catvar] 
for (i in 1:p.cat) cat.df[ ,i] <- squash(cat.df[ ,i]) 
head(cat.df) 
for(i in 1:p.cat) { 
    cat(as.vector(table(cat.df[ ,i])), "\n") 
}  
cts.df <- raw.df[ ,ctsvar] 
for(i in 1:p.cts) { 
    cat(quantile(cts.df[ ,i], probs = seq(0, 1, 0.1)), "\n") 
} 

Bây giờ, điều này có thể được đưa vào hàm trả về danh sách chứa khoảng thời gian, p, p.cat, cat.df, v.v. tuy nhiên điều này có vẻ hơi xấu với tôi. Tuy nhiên, điều khoản duy nhất để bao gồm các tập lệnh trong một gói có vẻ là thư mục 'demo' mà dường như không phải là cách đi đúng đắn. Lời khuyên về cách tiến hành sẽ được biết ơn sâu sắc.

(Nhưng lòng biết ơn sẽ không được biểu diễn chính thức như nó có vẻ rằng việc sử dụng một lời nhận xét chân thành cảm ơn bị phản đối.)

+2

tôi sử dụng 'inst/scripts /' mà còn làm cho các tập tin một sản (thực thi) kịch bản qua Rscript hoặc littler. –

+2

Tại sao hàm trả về số lượng đó có vẻ xấu xí với bạn? Có phải vì nó sẽ không in ra cùng một cách như bạn có nó trong kịch bản? Bạn có thể làm cho chức năng in tùy chỉnh của riêng bạn để làm điều đó một phần ... – Dason

+0

Dirk - bạn có biết một gói sử dụng phương pháp này không? –

Trả lời

4

Nó là tốt hơn để đóng gói mã của bạn trong một hàm. Không phải để trả lại một danh sách, các đối tượng S3 chẳng hạn chỉ là một danh sách với một thuộc tính thuộc tính.

object <- list(attribute.name = something, ..) 
class(object) <- "cname" 
return (object) 

Bạn cũng có thể sử dụng inst thư mục (như đã đề cập trong Dirk bình luận) kể từ khi nội dung của thư mục con inst sẽ được sao chép một cách đệ quy vào thư mục cài đặt.

  1. bạn tạo một thư mục inst:

    inst 
    ----scripts 
        some_scripts.R 
    
  2. Bạn có thể gọi nó là từ một hàm trong gói của bạn và sử dụng system.file cơ chế để tải nó.

    load_myscript <- function(){ 
        source(system.file(package='your_pkg_name','scripts/some_scripts.R')) 
    } 
    
  3. Bạn gọi nó như bất kỳ chức năng khác trong gói của bạn:

    load_myscript() 
    
+0

Tôi sẽ kiểm tra điều này. –

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