2012-10-23 16 views
5

Mi sto ritrovando ad aggiornare la versione e la data dei pacchetti r che mantengo abbastanza spesso. Sia la versione che la data esistono in DESCRIPTION, packageName-package.Rd e anche man/packageName-package.Rd. Ho dimenticato di aggiornare in un file più volte. Questi sono stati originariamente generati dal comando package.skeleton. C'è un simile comando/utility script per aggiornare la versione?È possibile parametrizzare una versione del pacchetto r?

MODIFICA: A un esame più attento, le versioni e le date generate automaticamente nei file Rd non sono necessarie. La data e la versione corrette appaiono ancora nel manuale generato. Quindi ovviamente questo lascia solo un posto per aggiornare queste informazioni.

+0

Usa 'roxygen' ... – Andrie

+1

È possibile utilizzare un' \ sEspr {} 'nei file RD. – hadley

+0

Sarebbe una buona idea, soprattutto se dovessi aggiornare solo in un posto. Come legare una variabile da R CMD check o build? – svenski

risposta

5

idea di Paul Hiemstra sembrava molto utile per me, così ho scritto queste poche righe di codice:

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

Questa funzione aggiorna il file DESCRIPTION utilizzando una versione sistema di numerazione version.major.minor-snapshot, per impostazione predefinita l'istantanea e la data vengono aggiornate. Per esempio:

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

# Update: 
upVers("Foo") 

# DESCIRPTION now shows version number 1.0.0-1 
+0

Buona idea. Tuttavia, ottengo l'output per essere binario quando si utilizza questo. – svenski

+0

Ho cambiato 'readChar' e' writeChar' in 'readLines' e' writeLines', dovrebbe funzionare meglio ora? –

1

Non sono a conoscenza di tale strumento, ma è possibile sfruttare funzioni R come gsub o strumenti esterni come grep e sed per programmare tale comportamento. Questo non dovrebbe essere più di un paio di righe di R.

+0

Sì, grazie. Una domanda molto tangenziale: c'è qualche caso in cui questi dovrebbero essere diversi? Non riesco a pensare a nessuno. – svenski

+1

Un pacchetto è una raccolta di codice. Il numero di versione enumera le modifiche in questa raccolta di codice. Pertanto, non c'è posto per numeri di versione differenti. –