set.seed(2345)
## ---------- example input
# Generating inputs for the tests below.
## Datasets
TSample <- TCells[ sample( names(TCells), 10 ) ]
t.steps <- subtracks( TSample, 1 )
load( system.file("extdata", "TCellsRaw.rda", package="celltrackR" ) )
traw.sample <- TCellsRaw[ sample( names( TCellsRaw ), 10 ) ]
traw.steps <- subtracks( traw.sample, 1 )
## Plane
p1 <- rnorm(3)
p2 <- p1 + c(1,2,3)
p3 <- p1 + c(-1,2,-3)
## Specific example to test pairsByTime output. Tracks 1 and 3 do not overlap in time,
# but both do overlap with track number 2.
test.tracks.pairsByTime <- function(){
track.1 <- data.frame( id = "1", t = seq(1,6), x = c(1,2,2,3,3,4), y = c(1,2,3,3,2,3) )
track.2 <- data.frame( id = "2", t = seq(3,8), x = c(3,2,3,4,4,5), y = c(5,4,4,4,5,6) )
track.3 <- data.frame( id = "3", t = seq(7,11), x = c(5,5,6,6,7), y = c(1,2,3,4,5) )
test.tracks <- as.tracks( rbind( track.1, track.2, track.3 ) )
}
# Make random track and a rotated counterpart such that angles are always X
rotatePoints <- function( coords, angle, degrees = TRUE ){
if( degrees ) angle <- pracma::deg2rad(angle)
single <- FALSE
if( is.null( ncol(coords))){
coords <- matrix( coords, ncol = 2 )
single <- TRUE
}
x <- coords[,1]
y <- coords[,2]
newX <- x * cos(angle) - y * sin(angle)
newY <- x * sin(angle) + y * cos(angle)
if( single ) return( c( newX, newY ) )
return( cbind( newX, newY ))
}
makeTracksAngle <- function( angle, degrees = TRUE ){
if( degrees ) ang <- pracma::deg2rad(angle)
track.1 <- data.frame( id = "1", t = seq( 1,5 ), x = rnorm( 5 ), y = rnorm (5) )
track.2 <- track.1
track.2[,c("x","y")] <- rotatePoints( track.1[,c("x","y")], angle )
track.2[,"id"] <- "2"
return( as.tracks( rbind( track.1, track.2 )))
}
makeTracksShifted <- function( shift ){
track.1 <- makeRandomTrack( 5 )
tracks <- c( track.1, track.1 )
names(tracks) <- c("1","2")
tracks[["2"]][,-1] <- t( apply( tracks[[2]][,-1], 1, function(x) x + shift ) )
return(tracks)
}
# Make random track
makeRandomTrack <- function( nCoord, id = "1", dim = 2 ){
track <- data.frame( id = id, t = seq(1,nCoord), x = rnorm( nCoord ), y = rnorm( nCoord ) )
if( dim == 3 ) track$z <- rnorm( nCoord )
return( as.tracks( track ) )
}
# make empty tracks
makeEmptyTracks <- function(){
return( TCells[1][-1] )
}
## ---------- vecAngle
a <- rnorm(3)
b <- rnorm(3)
n <- 100
am <- matrix( rnorm(n*3), ncol = 3 )
bm <- matrix( rnorm(n*3), ncol = 3 )
test_that("vecAngle returns correct output type", {
expect_true( is.numeric( vecAngle(a,b) ) )
expect_true( is.numeric( vecAngle(am,bm) ) )
expect_length( vecAngle( a,b ), 1 )
expect_length( vecAngle( am,bm), n )
})
test_that("vecAngle returns degrees/radians appropriately", {
expect_false( any( 0 > vecAngle( am, bm )) || any( vecAngle( am, bm) > 360 ) )
expect_false( any( 0 > vecAngle( am, bm, degrees = FALSE )) || any( vecAngle( am, bm, degrees = FALSE ) > 2*pi ) )
})
a.1D <- 1
b.1D <- 4
a.2D <- c(0,1)
b.2D <- c(1,0)
a.3D <- c(0,0,1)
b.3D <- c(1,0,0)
test_that("vecAngle does not depend on input order", {
expect_equal( vecAngle( a.1D, b.1D ), vecAngle( b.1D, a.1D ) )
expect_equal( vecAngle( a.2D, b.2D ), vecAngle( b.2D, a.2D ) )
expect_equal( vecAngle( a.3D, b.3D ), vecAngle( b.3D, a.3D ) )
})
test_that("vecAngle returns correct output", {
expect_equal( vecAngle( a.1D, b.1D), 0 )
expect_equal( vecAngle( a.1D, b.1D, degrees = FALSE), 0 )
expect_equal( vecAngle( a.2D, b.2D ), 90 )
expect_equal( vecAngle( a.2D, b.2D, degrees = FALSE ), pi/2 )
expect_equal( vecAngle( a.3D, b.3D ), 90 )
expect_equal( vecAngle( a.3D, b.3D, degrees = FALSE ), pi/2 )
})
## ---------- angleToPoint
test_that("angleToPoint returns correct output", {
expect_true( is.numeric( angleToPoint( TCells[[1]], p = c(1,1) ) ) )
expect_true( all( is.numeric( sapply( t.steps, angleToPoint, p = rnorm(2) ) ) ) )
expect_true( all( ( sapply( t.steps, angleToPoint, p = rnorm(2) ) ) >= 0 ) )
expect_true( all( ( sapply( t.steps, angleToPoint, p = rnorm(2) ) ) <= 180 ) )
expect_true( all( ( sapply( t.steps, angleToPoint, p = rnorm(2), degrees = FALSE ) ) <= pi ) )
})
# fake track of two steps that starts at (0,0), via a random coordinate, to (0,1);
# angle to (1,0) should be 90 degrees no matter the middle coordinate.
fakeTrack <- function( D3 = FALSE ){
fake.track <- rbind( c(0,0), 10*rnorm(2), c(0,1) )
fake.track <- cbind( seq(1,3), fake.track )
colnames( fake.track ) <- c("t","x","y")
if( D3 ){
fake.track <- cbind( fake.track, c(0, 10*rnorm(1), 0 ) )
colnames( fake.track )[4] <- "z"
}
return( fake.track )
}
test_that("angleToPoint returns correct value", {
expect_equal( angleToPoint( fakeTrack(), p = c(1,0) ), 90 )
})
## ---------- angleToDir
test_that("angleToDir returns correct output", {
expect_true( is.numeric( angleToDir( TCells[[1]], dvec = c(1,1) ) ) )
expect_true( all( is.numeric( sapply( t.steps, angleToDir, dvec = rnorm(2) ) ) ) )
expect_true( all( ( sapply( t.steps, angleToDir, dvec = rnorm(2) ) ) >= 0 ) )
expect_true( all( ( sapply( t.steps, angleToDir, dvec = rnorm(2) ) ) <= 180 ) )
expect_true( all( ( sapply( t.steps, angleToDir, dvec = rnorm(2), degrees = FALSE ) ) <= pi ) )
})
# fake track of two steps that starts at (0,0), via a random coordinate, to (0,1);
# angle to direction (1,0) should be 90 degrees no matter the middle coordinate.
# function fakeTrack() defined above for angleToPoint
test_that("angleToDir returns correct value", {
expect_equal( angleToDir( fakeTrack(), dvec = c(1,0) ), 90 )
})
## ---------- angleToPlane (plane p1,p2,p3 defined on top)
test_that("angleToPlane returns correct output", {
expect_true( is.numeric( angleToPlane( TCellsRaw[[1]], p1 = c(1,1,1), p2 = c(0,0,0), p3 = c(1,0,0) ) ) )
expect_true( all( is.numeric( sapply( traw.steps, angleToPlane, p1 = p1, p2 = p2, p3 = p3 ) ) ) )
expect_true( all( ( sapply( traw.steps, angleToPlane, p1 = p1, p2 = p2, p3 = p3 ) ) >= 0 ) )
expect_true( all( ( sapply( traw.steps, angleToPlane, p1 = p1, p2 = p2, p3 = p3 ) ) <= 90 ) )
expect_true( all( ( sapply( traw.steps, angleToPlane, p1 = p1, p2 = p2, p3 = p3, degrees = FALSE ) ) <= pi/2 ) )
})
# fake track of two steps that starts at (0,0,0), via a random coordinate, to (0,1,0);
# angle to z-plane should be 0 degrees no matter the middle coordinate because the
# overall displacement lies in the xy plane. Fun fakeTrack() is defined above.
test_that("angleToPlane returns correct value", {
expect_equal( angleToPlane( fakeTrack( D3 = TRUE ), p1 = c(1,1,0), p2 = c(0,0,0), p3 = c(1,0,0) ), 0 )
})
## ---------- distanceToPlane (plane p1,p2,p3 defined on top)
test_that("distanceToPlane returns correct output", {
expect_true( is.numeric( distanceToPlane( TCellsRaw[[1]], p1 = c(1,1,1), p2 = c(0,0,0), p3 = c(1,0,0) ) ) )
expect_true( all( is.numeric( sapply( traw.steps, distanceToPlane, p1 = p1, p2 = p2, p3 = p3 ) ) ) )
expect_true( all( ( sapply( traw.steps, distanceToPlane, p1 = p1, p2 = p2, p3 = p3 ) ) >= 0 ) )
})
## ---------- distanceToPoint
test_that("distanceToPoint returns correct output", {
expect_true( is.numeric( distanceToPoint( TCells[[1]], p = c(1,1) ) ) )
expect_true( all( is.numeric( sapply( t.steps, distanceToPoint, p = rnorm(2) ) ) ) )
expect_true( all( ( sapply( t.steps, distanceToPoint, p = rnorm(2) ) ) >= 0 ) )
})
## ---------- pairsByTime
test_that( "pairsByTime returns correct output", {
test.output <- pairsByTime( test.tracks.pairsByTime() )
expect_false( any( c(1:2,9:11) %in% test.output$t ) )
expect_true( all( 3:8 %in% test.output$t ) )
expect_equal( test.output[ "1-2-3", "dist" ], sqrt(5) )
expect_equal( test.output[ "1-2-4", "dist" ], sqrt(2) )
expect_equal( test.output[ "1-2-5", "dist" ], 2 )
expect_equal( test.output[ "1-2-6", "dist" ], 1 )
expect_equal( test.output[ "2-3-7", "dist" ], sqrt(17) )
expect_equal( test.output[ "2-3-8", "dist" ], 4 )
expect_warning( output1 <- nrow( pairsByTime( TSample, searchRadius = -1 ) ),
"pairsByTime: no tracks share time points; returning an empty dataframe." )
expect_equal( output1, 0 )
})
## ---------- angleSteps
test_that("angleSteps returns correct output when a single angle is requested", {
single <- angleSteps( TCells, names(TCells)[1:2], timePoints( TCells )[2] )
singleRadian <- angleSteps( TCells, names(TCells)[1:2], timePoints(TCells)[2], degrees = FALSE )
expect_true( is.numeric( single ) || is.na( single ) )
expect_length( single, 1 )
expect_true( single >= 0 )
expect_true( single <= 180 )
expect_true( singleRadian <= pi )
Angle30 <- makeTracksAngle( 30 )
expect_equal( angleSteps( Angle30, names(Angle30)[1:2], 1 ), 30 )
})
test_that("angleSteps returns correct output when multiple angles are requested", {
multi <- angleSteps( TCells, cbind(names(TCells)[1:3],names(TCells)[1:3]), timePoints(TCells)[2:4] )
multiRadian <- angleSteps( TCells, cbind(names(TCells)[1:3],names(TCells)[1:3]), timePoints(TCells)[2:4], degrees = FALSE )
expect_true( is.numeric( multi ) )
expect_length( multi, 3 )
expect_true( all( multi >= 0 ) )
expect_true( all( multi <= 180 ) )
expect_true( all ( multiRadian <= pi ) )
Angle30 <- makeTracksAngle( 30 )
expect_true( all( angleSteps( Angle30, cbind(rep( names(Angle30)[1], 4),rep( names(Angle30)[2], 4)), timePoints(Angle30)[1:4] ) - 30 < 1e-10 ) )
})
test_that("angleSteps returns NA when there are no steps at the same time", {
# tracks with ids 1 and 3 do not overlap in this track set:
test <- test.tracks.pairsByTime()
expect_warning( angles <- sapply( timePoints( test[1] ), function(x) angleSteps( test, c("1","3" ), x )),
"Warning: for some pairs I cannot find data for both steps at the indicated time. Returning NA."
)
expect_true( all( is.na( angles )) )
})
test_that("computing angle sequentially or all at once returns the same output", {
tr1 <- makeRandomTrack( 5 )
tr2 <- makeRandomTrack( 5, id = "2" )
tr <- c( tr1, tr2 )
angs <- sapply( seq(1,4), function(x) angleSteps( tr, c("1","2"), x ) )
angs2 <- angleSteps( tr, cbind( rep("1",4), rep("2",4) ), seq(1:4) )
expect_true( all( angs == angs2 ) )
})
test_that("angles are symmetrical", {
tr1 <- makeRandomTrack( 5 )
tr2 <- makeRandomTrack( 5, id = "2" )
tr <- c( tr1, tr2 )
a1 <- angleSteps( tr, c("1","2"), 1 )
a2 <- angleSteps( tr, c("2","1"), 1 )
expect_equal( a1, a2 )
})
## ---------- distanceSteps
test_that("distanceSteps returns correct output when a single distance is requested", {
single <- distanceSteps( TCells, names(TCells)[1:2], timePoints( TCells )[2] )
expect_true( is.numeric( single ) )
expect_length( single, 1 )
expect_true( single >= 0 )
shifted10x <- makeTracksShifted( c(10,0) )
expect_equal( distanceSteps( shifted10x, names(shifted10x)[1:2], 1 ), 10 )
})
test_that("distanceSteps returns correct output when multiple distances are requested", {
multi <- distanceSteps( TCells, cbind(names(TCells)[1:3],names(TCells)[1:3]), timePoints(TCells)[2:4] )
multi <- distanceSteps( TCells, cbind(names(TCells)[2:4],names(TCells)[1:3]), timePoints(TCells)[2:4] )
expect_true( is.numeric( multi ) )
expect_length( multi, 3 )
expect_true( all( multi >= 0 ) )
shifted10x <- makeTracksShifted( c(10,0) )
expect_true( all( angleSteps( shifted10x, cbind(rep( names(shifted10x)[1], 4),rep( names(shifted10x)[2], 4)), timePoints(shifted10x)[1:4] ) - 30 < 1e-10 ) )
})
test_that("distanceSteps returns NA when there are no steps at the same time", {
# tracks with ids 1 and 3 do not overlap in this track set:
test <- test.tracks.pairsByTime()
expect_warning( ds <- sapply( timePoints( test[1] ), function(x) distanceSteps( test, c("1","3" ), x )),
"Warning: cannot find data for both steps. Returning NA."
)
expect_true( all( is.na( ds )) )
})
test_that("computing distances sequentially or all at once returns the same output", {
tr1 <- makeRandomTrack( 5 )
tr2 <- makeRandomTrack( 5, id = "2" )
tr <- c( tr1, tr2 )
d <- sapply( seq(1,4), function(x) distanceSteps( tr, c("1","2"), x ) )
d2 <- distanceSteps( tr, cbind( rep("1",4), rep("2",4) ), seq(1:4) )
expect_true( all( d == d2 ) )
})
test_that("distances are symmetrical", {
tr1 <- makeRandomTrack( 5 )
tr2 <- makeRandomTrack( 5, id = "2" )
tr <- c( tr1, tr2 )
d1 <- distanceSteps( tr, c("1","2"), 1 )
d2 <- distanceSteps( tr, c("2","1"), 1 )
expect_equal( d1, d2 )
})
## ---------- stepPairs
test_that("stepPairs returns correct output", {
empty.tracks <- makeEmptyTracks()
single.step <- subtracks( TCells[1], 1 )[1]
p1 <- stepPairs(TSample)
expect_true( is.data.frame( p1 ) )
expect_true( is.data.frame( stepPairs(empty.tracks) ) )
expect_true( is.data.frame( stepPairs(single.step) ) )
expect_equal( ncol( p1 ), 3 )
expect_equal( ncol( stepPairs( empty.tracks ) ), 0 )
expect_equal( ncol( stepPairs( single.step ) ), 0 )
expect_true( is.character( p1[,1] ) )
expect_true( is.character( p1[,2] ) )
expect_true( is.numeric( p1[,3] ) )
expect_equal( ncol( stepPairs(
TCells, filter.steps = function(t) displacement(t) < 0 ) ), 0 )
})
## ---------- analyzeStepPairs
test_that("analyzeStepPairs returns correct output", {
tpairs <- analyzeStepPairs( TSample ) # use sample for speed
empty.tracks <- makeEmptyTracks()
single.step <- subtracks( TCells[1],1)[1]
pairs.empty <- analyzeStepPairs( empty.tracks )
pairs.single <- analyzeStepPairs( single.step )
expect_true( is.data.frame( tpairs ) )
expect_true( is.data.frame( pairs.empty ) )
expect_true( is.data.frame( pairs.single ) )
expect_equal( ncol( tpairs ), 5 )
expect_equal( ncol( pairs.empty ), 0 )
expect_equal( ncol( pairs.single ), 0 )
expect_true( is.character( tpairs[,1] ) )
expect_true( is.character( tpairs[,2] ) )
expect_true( is.numeric( tpairs[,3] ) )
expect_true( is.numeric( tpairs[,4] ) )
expect_true( is.numeric( tpairs[,5] ) )
expect_equal( ncol( analyzeStepPairs(
TSample, filter.steps = function(t) displacement(t) < 0 ) ), 0 )
expect_warning( noPairs <- analyzeStepPairs( TSample, searchRadius = 0 ),
"pairsByTime: no tracks share time points; returning an empty dataframe." )
expect_equal( nrow( noPairs), 0 )
})
test_that("analyzeStepPairs returns correct values", {
test <- test.tracks.pairsByTime()
pbt <- pairsByTime( test )
sp <- analyzeStepPairs( test )
tab1 <- table( paste0( pbt[,1], "-", pbt[,2] ) )
tab2 <- table( paste0( sp[,1], "-", sp[,2] ) )
# For any pair in pbt, there is always one step less than there are coordinates
expect_true( all( tab1-tab2 == 1))
distances <- apply( sp[,1:3], 1, function(x) distanceSteps( test, c(x[1],x[2]), x[3] ) )
angles <- apply( sp[,1:3], 1, function(x) angleSteps( test, c(x[1],x[2]), x[3] ) )
expect_true( all( sp$dist == distances ) )
expect_true( all( sp$angle == angles ))
})
## ---------- analyzeCellPairs
test_that("analyzeCellPairs returns correct output", {
tcpairs <- analyzeCellPairs( TSample ) # use sample for speed
empty.tracks <- makeEmptyTracks()
single.step <- subtracks( TCells[1],1)[1]
pairs.empty <- analyzeStepPairs( empty.tracks )
pairs.single <- analyzeStepPairs( single.step )
expect_true( is.data.frame( tcpairs ) )
expect_true( is.data.frame( pairs.empty ) )
expect_true( is.data.frame( pairs.single ) )
expect_equal( ncol( tcpairs ), 4 )
expect_equal( ncol( pairs.empty ), 0 )
expect_equal( ncol( pairs.single ), 0 )
expect_true( is.character( tcpairs[,1] ) )
expect_true( is.character( tcpairs[,2] ) )
expect_true( is.numeric( tcpairs[,3] ) )
expect_true( is.numeric( tcpairs[,4] ) )
# one row for each pair of ids, no matter whether they share steps or not:
expect_equal( ncol( combn( names(TSample), 2) ), nrow( analyzeCellPairs(TSample) ) )
expect_warning( noPairs <- analyzeCellPairs( TSample, searchRadius = 0 ),
"pairsByTime: no tracks share time points; returning an empty dataframe." )
expect_equal( nrow( noPairs), 0 )
})
test_that("analyzeCellPairs returns correct values", {
test <- test.tracks.pairsByTime()
pbt <- pairsByTime( test )
cp <- analyzeCellPairs( test )
# in this example data, 1 and 3 do not share time points. their distance is thus
# NA (undefined), but their angle should yield a value.
expect_true( is.na( cp["1-3","dist" ] ) )
expect_true( cp["1-3","angle"] >= 0 )
expect_true( cp["1-3","angle"] <= 180 )
distances <- apply( cp[,1:2], 1, function(x) distanceCells( test, x[1:2], quietly = TRUE ) )
angles <- apply( cp[,1:2], 1, function(x) angleCells( test, x[1:2] ) )
expect_true( all( cp$dist[-2] == distances[-2] ) )
expect_true( all( cp$angle == angles ))
expect_equal( cp$dist[1], 1 )
expect_equal( cp$dist[3], 4 )
})
## ---------- cellPairs
test_that("cellPairs returns correct output", {
empty.tracks <- makeEmptyTracks()
single.step <- subtracks( TCells[1],1)[1]
expect_true( is.data.frame( cellPairs(TCells) ) )
expect_true( is.data.frame( cellPairs(empty.tracks) ) )
expect_true( is.data.frame( cellPairs(single.step) ) )
expect_equal( ncol( cellPairs( TCells ) ), 2 )
expect_equal( ncol( cellPairs( empty.tracks ) ), 0 )
expect_equal( ncol( cellPairs( single.step ) ), 0 )
expect_true( is.character( cellPairs( TCells)[,1] ) )
expect_true( is.character( cellPairs( TCells)[,2] ) )
})
## ---------- angleCells
test_that("angleCells returns correct output when a single angle is requested", {
first <- angleCells( TCells, names(TCells)[1:2] )
expect_true( is.numeric( first ) )
expect_length( first, 1 )
expect_equal( angleCells( TCells, c("1","1") ), 0 )
sample <- angleCells( TCells, sample( names(TCells), 2 ) )
expect_true( sample >= 0 )
expect_true( sample <= 180 )
expect_true( angleCells( TCells, sample( names(TCells), 2 ), degrees = FALSE ) <= pi )
expect_equal( overallAngle( subtracks( TCells[1], 2)[[1]], degrees = TRUE ),
angleCells( subtracks( TCells[1], 1 ), c("1.1","1.2") ) )
Angle30 <- makeTracksAngle( 30 )
expect_equal( angleCells( Angle30, names(Angle30)[1:2], 1 ), 30 )
})
test_that("angleCells returns correct output when multiple angles are requested", {
multi <- angleCells( TCells, cbind(names(TCells)[2:4],names(TCells)[1:3]) )
expect_true( is.numeric( multi ) )
expect_length( multi, 3 )
expect_true( all( multi >= 0 ) )
expect_true( all( multi <= 180 ) )
Angle30 <- c( makeTracksAngle( 30 ), makeTracksAngle( 30 ) )
names( Angle30 ) <- c( "1","2","3","4" )
expect_true( all( angleCells( Angle30, rbind( c("1","2"), c("3","4") ) ) - 30 < 1e-10 ) )
})
test_that("computing angles sequentially or all at once returns the same output", {
tr <- c( makeTracksAngle( 30 ), makeTracksAngle( 30 ) )
names( tr ) <- c( "1","2","3","4" )
a <- c( angleCells( tr, c("1","2") ) , angleCells( tr, c("3","4") ) )
a2 <- angleCells( tr, rbind( c("1","2"), c("3","4") ) )
expect_true( all( a == a2 ) )
})
test_that("angles are symmetrical", {
tr1 <- makeRandomTrack( 5 )
tr2 <- makeRandomTrack( 5, id = "2" )
tr <- c( tr1, tr2 )
a1 <- angleCells( tr, c("1","2"), 1 )
a2 <- angleCells( tr, c("2","1"), 1 )
expect_equal( a1, a2 )
})
## ---------- distanceCells
test_that("distanceCells returns correct output when a single distance is requested", {
ids <- sample( names( TCells ), 2 )
dc <- distanceCells( TCells, ids, quietly = TRUE )
expect_true( is.numeric( dc ) || is.na(dc) )
expect_equal( distanceCells( TCells, c("1","1") ), 0 )
# NA when they share no timepts
test <- test.tracks.pairsByTime()
expect_true( is.na( distanceCells( test, c("1","3" ), quietly = TRUE ) ) )
expect_true( is.na(dc) || dc >= 0 )
expect_equal( distanceCells( subtracks( TCells[1], 2 ), c("1.1","1.2") ), 0 )
shifted10x <- makeTracksShifted( c(10,0) )
expect_equal( distanceCells( shifted10x, names(shifted10x)[1:2] ), 10 )
})
test_that("distanceCells returns correct output when multiple distances are requested", {
multi <- distanceCells( TCells, cbind(names(TCells)[2:4],names(TCells)[1:3]) )
expect_true( is.numeric( multi ) )
expect_length( multi, 3 )
expect_true( all( multi >= 0, na.rm = TRUE ) )
shifted10x <- c( makeTracksShifted( c(10,0) ), makeTracksShifted( c(10,0) ) )
names( shifted10x ) <- as.character( 1:4 )
expect_true( all( distanceCells( shifted10x, rbind( c( "1","2"), c("3","4")) ) - 10 < 1e-10 ) )
})
test_that("distanceCells returns NA when there are no steps at the same time", {
# tracks with ids 1 and 3 do not overlap in this track set:
test <- test.tracks.pairsByTime()
expect_warning( ds <- distanceCells( test, c("1","3" )),
"Warning: distance undefined for cells that don't share timepoints; returning NA."
)
expect_true( ( is.na( ds )) )
})
test_that("computing distances sequentially or all at once returns the same output", {
tr <- c( makeTracksAngle( 30 ), makeTracksAngle( 30 ) )
names( tr ) <- c( "1","2","3","4" )
d <- c( distanceCells( tr, c("1","2") ) , distanceCells( tr, c("3","4") ) )
d2 <- distanceCells( tr, rbind( c("1","2"), c("3","4") ) )
expect_true( all( d == d2 ) )
})
test_that("distances are symmetrical", {
tr1 <- makeRandomTrack( 5 )
tr2 <- makeRandomTrack( 5, id = "2" )
tr <- c( tr1, tr2 )
d1 <- distanceCells( tr, c("1","2") )
d2 <- distanceCells( tr, c("2","1") )
expect_equal( d1, d2 )
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.