Skip to content

Commit 8834698

Browse files
author
maechler
committed
diff(<matrix>, lag, diff.) simplification -> nicer fix - amending 89070
git-svn-id: https://svn.r-project.org/R/trunk@89098 00db46b3-68df-0310-9c12-caf00c1e9a41
1 parent ab5c1ce commit 8834698

File tree

4 files changed

+17
-25
lines changed

4 files changed

+17
-25
lines changed

doc/NEWS.Rd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@
406406
407407
\item \code{diff(m, lag, dif)} for matrix \code{m} now still returns
408408
matrices, also when \code{lag * dif > nrow(m)} (\PR{18972}, thanks to
409-
\I{Mikael Jagan}).
409+
\I{Mikael Jagan} and \I{Suharto Anggono}).
410410
\code{diff(<ts-matrix>)} remains matrix, even when it has length zero.
411411
412412
\item \code{str(x, give.attr=FALSE)} no longer shows attributes when

src/library/base/R/dates.R

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -433,23 +433,20 @@ rep.Date <- function(x, ...)
433433
diff.Date <- function (x, lag = 1L, differences = 1L, ...)
434434
{
435435
ismat <- is.matrix(x)
436-
xlen <- if (ismat) dim(x)[1L] else length(x)
437436
if (length(lag) != 1L || length(differences) > 1L || lag < 1L || differences < 1L)
438437
stop("'lag' and 'differences' must be integers >= 1")
439-
if (lag * differences >= xlen) {
440-
x0 <- if(ismat) x[0L, , drop = FALSE] else x[0L]
441-
return(x0 - x0) # '-' |-> "difftime"
442-
}
443-
r <- x
444438
i1 <- -seq_len(lag)
439+
i0 <- integer()
445440
if (ismat)
446-
for (i in seq_len(differences)) r <- r[i1, , drop = FALSE] -
447-
r[-nrow(r):-(nrow(r) - lag + 1L), , drop = FALSE]
448-
else for (i in seq_len(differences))
449-
r <- r[i1] - r[-length(r):-(length(r) - lag + 1L)]
441+
for (i in seq_len(differences))
442+
x <- x[i1, , drop = FALSE] -
443+
x[if(lag < (len <- nrow(x))) -len:-(len - lag + 1L) else i0, , drop = FALSE]
444+
else
445+
for(i in seq_len(differences))
446+
x <- x[i1] - x[if(lag < (len <- length(x))) -len:-(len - lag + 1L) else i0]
450447
if("units" %in% ...names() && (dunits <- list(...)$units) != "auto")
451-
units(r) <- match.arg(dunits, choices = setdiff(eval(formals(difftime)$units), "auto"))
452-
r
448+
units(x) <- match.arg(dunits, choices = setdiff(eval(formals(difftime)$units), "auto"))
449+
x
453450
}
454451

455452
## ---- additions in 2.6.0 -----

src/library/base/R/datetime.R

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1379,20 +1379,17 @@ diff.POSIXt <- function (x, lag = 1L, differences = 1L, ...)
13791379
{
13801380
ismat <- is.matrix(x)
13811381
r <- if(inherits(x, "POSIXlt")) as.POSIXct(x) else x
1382-
xlen <- if (ismat) dim(x)[1L] else length(r)
13831382
if (length(lag) != 1L || length(differences) > 1L || lag < 1L || differences < 1L)
13841383
stop("'lag' and 'differences' must be integers >= 1")
1385-
if (lag * differences >= xlen) {
1386-
x0 <- if(ismat) x[0L, , drop = FALSE] else x[0L]
1387-
return(x0 - x0) # '-' |-> "difftime"
1388-
}
13891384
i1 <- -seq_len(lag)
1385+
i0 <- integer()
13901386
if (ismat)
13911387
for (i in seq_len(differences))
1392-
r <- r[i1, , drop = FALSE] - r[-nrow(r):-(nrow(r) - lag + 1), , drop = FALSE]
1388+
r <- r[i1, , drop = FALSE] -
1389+
r[if(lag < (len <- nrow(r))) -len:-(len - lag + 1L) else i0, , drop = FALSE]
13931390
else
13941391
for (i in seq_len(differences))
1395-
r <- r[i1] - r[-length(r):-(length(r) - lag + 1L)]
1392+
r <- r[i1] - r[if(lag < (len <- length(r))) -len:-(len - lag + 1L) else i0]
13961393
dots <- list(...)
13971394
if("units" %in% names(dots) && dots$units != "auto")
13981395
units(r) <- match.arg(dots$units, choices = setdiff(eval(formals(difftime)$units), "auto"))

src/library/base/R/diff.R

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,19 @@ diff <- function(x, ...) UseMethod("diff")
2121
diff.default <- function(x, lag = 1L, differences = 1L, ...)
2222
{
2323
ismat <- is.matrix(x)
24-
xlen <- if(ismat) dim(x)[1L] else length(x)
2524
if (length(lag) != 1L || length(differences) != 1L ||
2625
lag < 1L || differences < 1L)
2726
stop("'lag' and 'differences' must be integers >= 1")
28-
if (lag * differences >= xlen)
29-
return( if(ismat) x[0L, , drop = FALSE] else x[0L] ) # empty, but of proper mode
3027
r <- unclass(x) # don't want class-specific subset methods
3128
i1 <- -seq_len(lag)
29+
i0 <- integer()
3230
if (ismat)
3331
for (i in seq_len(differences))
3432
r <- r[i1, , drop = FALSE] -
35-
r[-nrow(r):-(nrow(r)-lag+1L), , drop = FALSE]
33+
r[if(lag < (len <- nrow(r))) -len:-(len-lag+1L) else i0, , drop = FALSE]
3634
else
3735
for (i in seq_len(differences))
38-
r <- r[i1] - r[-length(r):-(length(r)-lag+1L)]
36+
r <- r[i1] - r[if(lag < (len <- length(r))) -len:-(len-lag+1L) else i0]
3937
class(r) <- oldClass(x)
4038
r
4139
}

0 commit comments

Comments
 (0)