Update nuclearWeaponStates dataset

Write existing nuclearWeaponStates data.frame

This document describes how to add new information to the nuclearWeaponStates dataset in the Ecdat package.

The first step is to update the companion nuclearWeaponStates.Rd help file.

Then update the nuclearWeaponStates object so it matches the revised description.

One way to do this is to export the nuclearWeaponStates dataset as a csv file so you can edit it in a spreadsheet:

library(Ecdat)
availInPkg <- objects(2,
        pattern='nuclearWeaponStates')
canWrite <- FALSE 
(TempDir <- tempdir())
## [1] "/tmp/RtmpMb0UTZ"
# Write the name of TempDir so I can find it. 
# Or set 
# TempDir <- getwd()
# for manual processing.

if('nuclearWeaponStates' %in% availInPkg){
  data(nuclearWeaponStates)
  TempFile <- file.path(TempDir, 
                'nuclearWeaponStates.csv')
  canWr <- try(write.csv(nuclearWeaponStates, 
            TempFile, row.names=FALSE))
  if(!inherits(canWr, 'try-error')){
      canWrite <- TRUE
  }
} 
getwd()
## [1] "/tmp/RtmpKx4vG5/Rbuild21a72e8a80b5/Ecfun/vignettes"
dir(TempDir)
## character(0)

Edit and read

If desired, edit the csv file just created as mentioned above. Ignore firstTestYr and yearsSinceLastFirstTest, because we compute them in this vignette from firstTest. That’s because we want (a) firstTestYr to be firstTest as numeric years rather than as days since 1970-01-01, and (b) yearsSinceLastFirstTest to be diff(firstTestYr).

If you edit it externally, put it in the current working directory and read it as follows:

library(Ecfun)
if(canWrite){
  nWS <- read.csv(TempFile, 
              stringsAsFactors = FALSE)
  igno <- c('nation', 'ctry', 'Maddison')
  igno. <- (igno %in% names(nWS))
  Dts <- c("firstTest", "startNucPgm")
  Dts. <- (Dts %in% names(nWS))
  nWSdf <-asNumericDF(nWS, 
      ignore=igno[igno.], Dates=Dts[Dts.]) 
}

(The “ignore” argument in asNumericDF forces that function to retain the data in those columns as is. In this case, they should be of class “character”. Similarly, the “Dates” argument converts the indicated column to class “Date”.)

Compute firstTestYr and yearsSinceLastFirstTest

if(canWrite){
  nmsNucWeapSt <- names(nWSdf)
  if('firstTest' %in% nmsNucWeapSt){
    firstTestYr <- lubridate::decimal_date(
        nWSdf$firstTest) 
    yearsSinceLastFirstTest <- c(NA, 
      diff(firstTestYr) ) 
  } else {
    print(nmsNucWeapSt)
    err <- paste("'firstTest' not in", 
        "names(nuclearWeaponStates)")
    stop(err)
  }
  nuclearWeaponStates <- nWSdf
  nuclearWeaponStates$firstTestYr <- firstTestYr
  if('startNucPgm' %in% nmsNucWeapSt){
    startNucPgmYr <- lubridate::decimal_date(
        nWSdf$startNucPgm) 
    nuclearWeaponStates$startNucPgmYr <- startNucPgmYr
  } 
#  else {
#    print(nmsNucWeapSt)
#    err2 <- paste("'startNucPgm' not in", 
#        "names(nuclearWeaponStates)")
#    stop(err2)
#  }
}

number of nuclearWeapons

Check the number of nuclearWeapons

if(canWrite){
  nukes <- rowSums(nuclearWeaponStates[, 
    c('nYieldNA', 'nLowYield', 'nMidYield',
      'nHighYield')])
  dnuk <- (nuclearWeaponStates[,
      'nuclearWeapons'] - nukes)
  if(length(oopsNuk <- which(dnuk != 0))>0){
    cat('count errors.  bad rows =')
    print(oopsNuk)
  }
}

plot

if(canWrite){
  data(nuclearWeaponStates)
  plot(yearsSinceLastFirstTest~firstTest,
       nuclearWeaponStates, las=1, 
       type='h', xlab='', ylab='')
  with(nuclearWeaponStates, 
    text(firstTest, 
        yearsSinceLastFirstTest, ctry))
}

… to svgs

if(FALSE){
  svg('Time2nextNuclearState.svg')
  cex. <- 1.5
  plot(yearsSinceLastFirstTest~firstTest,
       nuclearWeaponStates, las=1, 
       type='h', xlab='', ylab='',
       cex.axis=cex.)
  with(nuclearWeaponStates, 
    text(firstTest, yearsSinceLastFirstTest,
         ctry, cex=cex.))
  dev.off()
}

save

if(canWrite){
  cat('canWrite = TRUE')
  save(nuclearWeaponStates, 
       file='nuclearWeaponStates.rda')
}

Then copy the *.rda file from the current working directory to ecdat\data, and run R CMD check as usual.