context("cameraOperation")
library(camtrapR)
library(lubridate)
# load station information
data(camtraps)
# create camera operation matrix
# dates are specified as character
camop_no_problem <- cameraOperation(CTtable = camtraps,
stationCol = "Station",
setupCol = "Setup_date",
retrievalCol = "Retrieval_date",
hasProblems = FALSE,
dateFormat = "%d/%m/%Y"
)
# with problems/malfunction
camop_problem <- cameraOperation(CTtable = camtraps,
stationCol = "Station",
setupCol = "Setup_date",
retrievalCol = "Retrieval_date",
writecsv = FALSE,
hasProblems = TRUE,
dateFormat = "%d/%m/%Y"
)
# table with duplicate rows
camtraps_duplicate <- camtraps
camtraps_duplicate[4,] <- camtraps_duplicate[1,]
camtraps_duplicate$camera <- "cam1"
camtraps_duplicate[c(5,6),] <- camtraps_duplicate[3,]
camtraps_duplicate$session <- 1
# convert setup / retrieval / problem to Date class
camtraps_date <- camtraps
camtraps_date$Setup_date <- dmy(camtraps$Setup_date)
camtraps_date$Retrieval_date <- dmy(camtraps$Retrieval_date )
camtraps_date$Problem1_from <- dmy(camtraps$Problem1_from )
camtraps_date$Problem1_to <- dmy(camtraps$Problem1_to )
# dates are specified as Date class
camop_dates <- cameraOperation(CTtable = camtraps_date,
stationCol = "Station",
setupCol = "Setup_date",
retrievalCol = "Retrieval_date",
#writecsv = FALSE,
hasProblems = TRUE,
dateFormat = "ymd"
)
# Date-time
# add time of day to setup / retrieval / problem
# date-time is provided as POXIXct
camtraps_date_time <- camtraps
camtraps_date_time$Setup_date <- dmy_h(paste(camtraps$Setup_date, "12"))
camtraps_date_time$Retrieval_date <- dmy_h(paste(camtraps$Retrieval_date, "15" ))
camtraps_date_time$Problem1_from <- dmy_h(paste(camtraps$Problem1_from, "06" ), quiet = TRUE)
camtraps_date_time$Problem1_to <- dmy_h(paste(camtraps$Problem1_to, "15" ), quiet = TRUE)
camop_dates_time <- cameraOperation(CTtable = camtraps_date_time,
stationCol = "Station",
setupCol = "Setup_date",
retrievalCol = "Retrieval_date",
hasProblems = TRUE,
dateFormat = "ymd HMS"
)
# date-time is provided as character
camtraps_date_time_char <- camtraps_date_time
camtraps_date_time_char$Setup_date <- as.character(camtraps_date_time$Setup_date)
camtraps_date_time_char$Retrieval_date <- as.character(camtraps_date_time$Retrieval_date)
camtraps_date_time_char$Problem1_from <- as.character(camtraps_date_time$Problem1_from)
camtraps_date_time_char$Problem1_to <- as.character(camtraps_date_time$Problem1_to)
camop_dates_time_char <- cameraOperation(CTtable = camtraps_date_time_char,
stationCol = "Station",
setupCol = "Setup_date",
retrievalCol = "Retrieval_date",
hasProblems = TRUE,
dateFormat = "ymd HMS"
)
# set one time to midnight. It should still work.
# issue is that as.character(POSIXct) removes the time if it's exactly midnight
# input is character
camtraps_date_time_char_midnight <- camtraps_date_time_char
camtraps_date_time_char_midnight$Setup_date[1] <- "2009-04-02 00:00:00"
camop_dates_time_char_midnight <- cameraOperation(CTtable = camtraps_date_time_char_midnight,
stationCol = "Station",
setupCol = "Setup_date",
retrievalCol = "Retrieval_date",
hasProblems = TRUE,
dateFormat = "ymd HMS"
)
# input is POSIXct
# camtraps_date_time_char <- camtraps_date_time
# camtraps_date_time_char$Setup_date <- format(camtraps_date_time_char$Setup_date,
# format = "%Y-%m-%d %H:%M:%S")
camtraps_date_time_midnight <- camtraps_date_time_char_midnight
camtraps_date_time_midnight$Setup_date <- ymd_hms(camtraps_date_time_midnight$Setup_date)
camtraps_date_time_midnight$Retrieval_date <- ymd_hms(camtraps_date_time_midnight$Retrieval_date)
camtraps_date_time_midnight$Problem1_from <- ymd_hms(camtraps_date_time_midnight$Problem1_from)
camtraps_date_time_midnight$Problem1_to <- ymd_hms(camtraps_date_time_midnight$Problem1_to)
camop_dates_time_midnight <- cameraOperation(CTtable = camtraps_date_time_midnight,
stationCol = "Station",
setupCol = "Setup_date",
retrievalCol = "Retrieval_date",
hasProblems = TRUE,
dateFormat = "ymd HMS"
)
# change datetime format
camtraps_date_time_format <- camtraps_date_time
stupid_date_format <- "%H:%M:%S %d/%m/%Y" #"%d/%m/%Y %H:%M:%S"
camtraps_date_time_format$Setup_date <- format(camtraps_date_time_format$Setup_date,
format = stupid_date_format)
camtraps_date_time_format$Retrieval_date <- format(camtraps_date_time_format$Retrieval_date,
format = stupid_date_format)
camtraps_date_time_format$Problem1_from <- format(camtraps_date_time_format$Problem1_from,
format = stupid_date_format)
camtraps_date_time_format$Problem1_to <- format(camtraps_date_time_format$Problem1_to,
format = stupid_date_format)
camop_dates_time_format <- cameraOperation(CTtable = camtraps_date_time_format,
stationCol = "Station",
setupCol = "Setup_date",
retrievalCol = "Retrieval_date",
hasProblems = TRUE,
dateFormat = "HMS dmy"
)
# Test section
test_that("POSIX and character give same output", {
expect_equal(camop_dates_time, camop_dates_time_char)
expect_equal(camop_dates_time_char_midnight, camop_dates_time_midnight)
})
test_that("Different date formats work", {
expect_equal(camop_dates_time_format, camop_dates_time)
})
camop_dates_time_format
test_that("duplicate row error messages work", {
expect_error(cameraOperation(CTtable = camtraps_duplicate,
stationCol = "Station",
#sessionCol = "session",
#cameraCol = "camera",
#byCamera = TRUE,
setupCol = "Setup_date",
retrievalCol = "Retrieval_date",
writecsv = FALSE,
hasProblems = FALSE,
dateFormat = "%d/%m/%Y"
),
"2 stations have more than 1 item in CTtable. Please specify 'cameraCol' or 'sessionCol'
StationA: 2
StationC: 3", fixed = TRUE)
expect_error(cameraOperation(CTtable = camtraps_duplicate,
stationCol = "Station",
#sessionCol = "session",
cameraCol = "camera",
byCamera = TRUE,
setupCol = "Setup_date",
retrievalCol = "Retrieval_date",
writecsv = FALSE,
hasProblems = FALSE,
dateFormat = "%d/%m/%Y"
),
"2 station/camera combinations have more than 1 item in CTtable. Consider specifying 'sessionCol' if you have multiple sessions / seasons
StationA - camera cam1: 2
StationC - camera cam1: 3")
expect_error(cameraOperation(CTtable = camtraps_duplicate,
stationCol = "Station",
sessionCol = "session",
#cameraCol = "camera",
#byCamera = TRUE,
setupCol = "Setup_date",
retrievalCol = "Retrieval_date",
writecsv = FALSE,
hasProblems = FALSE,
dateFormat = "%d/%m/%Y"
),
"2 station/session combinations have more than 1 item in CTtable. Consider specifying 'cameraCol' if you have multiple cameras per station
StationA - session 1: 2
StationC - session 1: 3")
expect_error(cameraOperation(CTtable = camtraps_duplicate,
stationCol = "Station",
sessionCol = "session",
cameraCol = "camera",
byCamera = TRUE,
setupCol = "Setup_date",
retrievalCol = "Retrieval_date",
writecsv = FALSE,
hasProblems = FALSE,
dateFormat = "%d/%m/%Y"
)
,
"2 station/camera/session combination have more than 1 item in CTtable.
StationA - camera cam1 - session 1: 2
StationC - camera cam1 - session 1: 3")
}
)
test_that("Input columns in class 'Date' work", {
expect_identical(camop_dates, camop_problem)
}
)
test_that("Input columns with hours (POSIXct) work", {
expect_true(inherits(camop_dates_time, "matrix"))
expect_true(!identical(camop_dates_time, camop_dates))
}
)
test_that("Error when Problem ends after retrieval", {
# Date-time as POSIX
camtraps_date_time$Problem1_to[3] <- camtraps_date_time$Problem1_to[3] + 1
expect_error(cameraOperation(CTtable = camtraps_date_time,
stationCol = "Station",
setupCol = "Setup_date",
retrievalCol = "Retrieval_date",
hasProblems = TRUE,
dateFormat = "ymd HMS"),
"StationC : Problem ends after retrieval"
)
# Dates as character
camtraps$Problem1_to[3] <- "18/05/2009"
expect_error(cameraOperation(CTtable = camtraps,
stationCol = "Station",
setupCol = "Setup_date",
retrievalCol = "Retrieval_date",
writecsv = FALSE,
hasProblems = TRUE,
dateFormat = "%d/%m/%Y"),
"StationC : Problem ends after retrieval"
)
}
)
test_that("setting time to 00:00:00 works", {
expect_true(camop_dates_time_midnight[1,1] == 1)
expect_true(camop_dates_time_char_midnight[1,1] == 1)
expect_true(!identical(camop_dates_time_midnight, camop_dates))
}
)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.