#' Update a person file.
#' @description
#' This function creates, prints, extends, deletes, or modifies the file for
#' person \code{name}.
#' @details
#' Internally, \code{name} is transformed to a string which can be properly
#' saved by \link{transform_name}. The file for \code{name} is
#' \itemize{
#' \item created, if \code{name} does not exist,
#' \item printed, if \code{name} does exist,
#' \item extended by \code{note}, if \code{note} is specified,
#' \item deleted, if \code{delete = "all"},
#' \item modified (i.e. the notes with the numbers specified in \code{delete})
#' get deleted, if \code{delete} is a vector of numbers.
#' }
#' Set \code{name = "all"} to print all saved person files.
#' @param name
#' The person's name.
#' @param note
#' A note for person \code{name}.
#' @param delete
#' A number or a vector of numbers, which correspond to the notes that get
#' deleted. If \code{delete = "all"}, the whole person file gets deleted.
#' @inheritParams folder
#' @return
#' Returns invisibly the updated folder (which is an object of class
#' \code{personfiles}). The folder also is saved in \code{folder_dir}.
#' @examples
#' ### Create encrypted folder.
#' folder_dir <- tempdir()
#' folder(password = "secret", folder_dir = folder_dir, overwrite = TRUE)
#' ### Create person file for John Doe.
#' person(name = "John Doe", note = "Likes chess.", password = "secret",
#' folder_dir = folder_dir)
#' ### Add another note for John Doe.
#' person(name = "John Doe", note = "Always plays 1.e4.", password = "secret",
#' folder_dir = folder_dir)
#' ### Print person file for John Doe.
#' person(name = "John Doe", password = "secret", folder_dir = folder_dir)
#' ### Create person file for Jane Doe.
#' person(name = "Jane Doe", note = "Married to John Doe.",
#' password = "secret", folder_dir = folder_dir)
#' ### Print all person files.
#' person(name = "all", password = "secret", folder_dir = folder_dir)
#' ### Delete note 'Always plays 1.e4.' of John Doe.
#' person(name = "John Doe", delete = 2, password = "secret",
#' folder_dir = folder_dir)
#' ### Delete file of Jane Doe.
#' person(name = "Jane Doe", delete = "all", password = "secret",
#' folder_dir = folder_dir)
#' @export
person <- function(name = "all", note = NULL, delete = NULL, password = NULL,
folder_dir = ".") {
if(!is.null(delete) && delete != "all" &&
!(is.numeric(delete) && delete%%1==0 && delete>0))
stop("'delete' must be NULL, 'all', a number, or a vector of numbers.")
path <- personfiles_path(folder_dir = folder_dir)
if(file.exists(path)){
folder_encrypted <- readRDS(path)
} else {
stop("Could not open ",path,".")
}
folder_decrypted <- folder_decrypt(folder_encrypted = folder_encrypted,
password = password)
if(name == "all"){
print.personfiles(folder_decrypted, name = "all")
} else {
tname <- transform_name(name)
if(!tname %in% names(folder_decrypted)){
folder_decrypted[[tname]] <- list()
cat("Created file for",paste0(name,"."),"\n")
}
if(!is.null(note)){
note <- paste(as.character(note), collapse = "; ")
index <- length(folder_decrypted[[tname]])+1
folder_decrypted[[tname]][[index]] <- list("date" = Sys.Date(),
"note" = note)
cat("Added note for",paste0(name,"."),"\n")
}
if(!is.null(delete)){
if(delete == "all"){
folder_decrypted[[tname]] <- NULL
cat("Deleted file for",paste0(name,"."),"\n")
} else {
for(i in delete) folder_decrypted[[tname]][[i]] <- NULL
cat("Deleted note(s) for",paste0(name,"."),"\n")
}
}
print.personfiles(folder_decrypted, name = name)
}
folder_encrypted <- folder_encrypt(folder_decrypted = folder_decrypted,
password = password)
saveRDS(folder_encrypted, path)
return(invisible(folder_encrypted))
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.