2012-10-23 8 views
5

Ich stelle fest, dass ich die Version und das Datum der r-Pakete aktualisiere, die ich ziemlich oft bearbeite. Sowohl die Version als auch das Datum existieren in BESCHREIBUNG, packageName-package.Rd und auch man/packageName-package.Rd. Ich habe vergessen, in einer Datei mehrmals zu aktualisieren. Diese wurden ursprünglich vom Befehl package.skeleton generiert. Gibt es ein ähnliches Befehls-/Dienstprogrammskript, um die Version zu aktualisieren?Ist es möglich, eine r-Paketversion zu parametrieren?

EDIT: Bei näherer Betrachtung werden die automatisch generierten Versionen und Daten in den Rd-Dateien nicht benötigt. Das korrekte Datum und die korrekte Version erscheinen weiterhin im generierten Handbuch. Offensichtlich bleibt nur ein Platz, um diese Informationen zu aktualisieren.

+0

Verwenden 'roxygen' ... – Andrie

+1

Sie könnten ein' \ Sexpr {} 'in der dritten Dateien verwenden. – hadley

+0

Das wäre eine gute Idee, besonders wenn ich nur an einem Ort updaten müsste. Wie binde ich eine Variable von R CMD Check oder Build? – svenski

Antwort

5

Paul Hiemstra Idee sehr nützlich für mich schien, so schrieb ich diese wenigen Zeilen Code:

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) 
} 

Diese Funktion aktualisiert die DESCRIPTION Datei eine Version mit Nummerierungssystem version.major.minor-snapshot, standardmäßig werden der Schnappschuss und das Datum aktualisiert. Zum Beispiel:

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

# Update: 
upVers("Foo") 

# DESCIRPTION now shows version number 1.0.0-1 
+0

Gute Idee. Ich bekomme jedoch die Ausgabe binär, wenn Sie dies verwenden. – svenski

+0

Ich habe 'readChar' und' writeChar' in 'readLines' und' writeLines' geändert, sollte jetzt besser funktionieren? –

1

Ich bin mir eines solchen Tools nicht bewusst, aber Sie könnten R-Funktionen wie gsub oder externe Tools wie grep und sed nutzen, um ein solches Verhalten zu programmieren. Dies sollte nicht mehr als ein paar Zeilen von R.

+0

Ja, danke. Eine sehr tangentiale Frage: Gibt es einen Fall, in dem diese anders sein sollten? Ich kann mir keine vorstellen. – svenski

+1

Ein Paket ist eine Sammlung von Code. Die Versionsnummer zählt Änderungen in dieser Auflistung von Code auf. Daher gibt es keinen Platz für verschiedene Versionsnummern. –

Verwandte Themen