2012-10-23 43 views
5

Tôi đang tìm bản thân mình cập nhật phiên bản và ngày của các gói r mà tôi duy trì khá thường xuyên. Cả phiên bản và ngày tồn tại trong DESCRIPTION, packageName-package.Rd và cũng là man/packageName-package.Rd. Tôi đã quên cập nhật trong một tệp nhiều lần. Chúng ban đầu được tạo ra bởi lệnh package.sk. Có một kịch bản lệnh/tiện ích tương tự để cập nhật phiên bản không?Có thể tham số hóa phiên bản gói r không?

EDIT: Khi kiểm tra kỹ hơn các phiên bản và ngày được tạo tự động trong tệp Rd là không cần thiết. Ngày và phiên bản chính xác vẫn xuất hiện trong hướng dẫn được tạo. Vì vậy, rõ ràng điều này chỉ để lại một nơi để cập nhật thông tin này.

+0

Sử dụng 'roxygen' ... – Andrie

+1

Bạn có thể sử dụng' \ Sexpr {} 'trong tệp thứ. – hadley

+0

Đó sẽ là một ý tưởng hay, đặc biệt nếu tôi chỉ phải cập nhật ở một nơi. Làm cách nào để liên kết biến từ kiểm tra hoặc xây dựng R CMD? – svenski

Trả lời

5

ý tưởng Paul Hiemstra dường như rất hữu ích đối với tôi, vì vậy tôi đã viết những vài dòng mã:

upVers <- function(path,update="snapshot",date=TRUE,simplify=TRUE) 
{ 
    # This function updates the description file from package 
    # in path (assumed work directory by default, as typical 
    # with projects in RStudio using GitHub). 

    # Usage: 
    # path: path to contents of a package 
    # update: What to update? "version", "major", "minor", "snapshot" 
    # date: Update date as well? 
    # simplfy: omit trailing zeros? 

    # Assumes following numbering system: 
    # version.major.minor-snapshot 

    uplist <- c("version","major","minor","snapshot") 

    if (missing(path)) path <- getwd() 
    DESCfile <- paste0(path,"/DESCRIPTION") 
    if (!file.exists(DESCfile)) stop("DESCRIPTION does not exist. Is this the folder of a package?") 

    DESC <- readLines(DESCfile) 

    ### Update date: 
    if (date) 
    { 
    DESC <- gsub("(?<=Date:)\\d{4}-\\d{2}-\\d{2}",Sys.Date(),DESC,perl=TRUE) 
    } 

    ### Update version: 
    Vers <- regmatches(DESC,regexpr("(?<=Version:)\\d+\\.?\\d*\\.?\\d*\\-?\\d*",DESC,perl=TRUE)) 
    Vers <- as.numeric(unlist(strsplit(Vers,split="\\.|\\-"))) 
    Vers <- c(Vers,rep(0,length=4-length(Vers))) 
    Vers[grep(update,uplist,ignore.case=TRUE)] <- Vers[grep(update,uplist,ignore.case=TRUE)] + 1 
    Vers[1:4>grep(update,uplist,ignore.case=TRUE)] <- 0 

    # Combine and replace: 
    Vers <- paste(paste(Vers[1:3],collapse="."),Vers[4],sep="-") 
    if (simplify) 
    { 
    Vers <- gsub("\\.?0?\\.?0?\\-?0?$","",Vers) 
    } 
    DESC <- gsub("(?<=Version:)\\d+\\.?\\d*\\.?\\d*\\-?\\d*",Vers,DESC,perl=TRUE) 

    # Write Description: 
    writeLines(DESC,DESCfile) 
} 

Chức năng này cập nhật DESCRIPTION tập tin sử dụng một phiên bản hệ thống đánh số version.major.minor-snapshot, theo mặc định ảnh chụp và ngày được cập nhật. Ví dụ:

# An R package: 
f <- function() "foo" 
package.skeleton("Foo","f") 

# Update: 
upVers("Foo") 

# DESCIRPTION now shows version number 1.0.0-1 
+0

Ý tưởng hay. Tuy nhiên, tôi nhận được đầu ra là nhị phân khi sử dụng này. – svenski

+0

Tôi đã thay đổi 'readChar' và' writeChar' thành 'readLines' và' writeLines', bây giờ có hoạt động tốt hơn không? –

1

Tôi không biết về công cụ như vậy, nhưng bạn có thể tận dụng các hàm R như gsub hoặc các công cụ bên ngoài như grepsed để lập trình hành vi như vậy. Điều này không nên có nhiều hơn một vài dòng R.

+0

Vâng, cảm ơn. Một câu hỏi rất liên tục: liệu có trường hợp nào khác nhau không? Tôi không thể nghĩ ra được. – svenski

+1

Gói là bộ sưu tập mã. Số phiên bản liệt kê các thay đổi trong bộ sưu tập mã này. Do đó, không có nơi dành cho các số phiên bản khác nhau. –

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