diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/R/diff.R b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/R/diff.R new file mode 100644 index 0000000000000000000000000000000000000000..d66dd250036917af2275475b56eb3a434db336d5 --- /dev/null +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/R/diff.R @@ -0,0 +1,41 @@ +# File src/library/base/R/diff.R +# Part of the R package, http://www.R-project.org +# +# Copyright (C) 1995-2012 The R Core Team +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# A copy of the GNU General Public License is available at +# http://www.r-project.org/Licenses/ + +diff <- function(x, ...) UseMethod("diff") + +diff.default <- function(x, lag = 1L, differences = 1L, ...) +{ + ismat <- is.matrix(x) + xlen <- if(ismat) dim(x)[1L] else length(x) + if (length(lag) > 1L || length(differences) > 1L || + lag < 1L || differences < 1L) + stop("'lag' and 'differences' must be integers >= 1") + if (lag * differences >= xlen) + return(x[0L]) # empty, but of proper mode + r <- unclass(x) # don't want class-specific subset methods + i1 <- -seq_len(lag) + if (ismat) + for (i in seq_len(differences)) + r <- r[i1, , drop = FALSE] - + r[-nrow(r):-(nrow(r)-lag+1L), , drop = FALSE] + else + for (i in seq_len(differences)) + r <- r[i1] - r[-length(r):-(length(r)-lag+1L)] + class(r) <- oldClass(x) + r +} diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test index aa816adb48de03ad76b3ac549a5d9ee346d308d5..29ac63cb1f6573978d8cbe4bec0e55ac182ea1bb 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test @@ -7416,6 +7416,22 @@ Error in print(x, y) : #{ m <- matrix(1:9, nrow=3) ; diag(m) } [1] 1 5 9 +##com.oracle.truffle.r.test.simple.TestSimpleBuiltins.testDiff +#{ diff(1:10, 2) } +[1] 2 2 2 2 2 2 2 2 + +##com.oracle.truffle.r.test.simple.TestSimpleBuiltins.testDiff +#{ diff(1:10, 2, 2) } +[1] 0 0 0 0 0 0 + +##com.oracle.truffle.r.test.simple.TestSimpleBuiltins.testDiff +#{ x <- cumsum(cumsum(1:10)) ; diff(x, differences = 2) } +[1] 3 4 5 6 7 8 9 10 + +##com.oracle.truffle.r.test.simple.TestSimpleBuiltins.testDiff +#{ x <- cumsum(cumsum(1:10)) ; diff(x, lag = 2) } +[1] 9 16 25 36 49 64 81 100 + ##com.oracle.truffle.r.test.simple.TestSimpleBuiltins.testDimensions #{ NCOL(1) } [1] 1 diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/all/AllTests.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/all/AllTests.java index 25795bbad29192733f0e6b874124004b2a164b1a..9f80add3385e800a2dc0dfc798705ec8260b7c9c 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/all/AllTests.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/all/AllTests.java @@ -7098,6 +7098,26 @@ public class AllTests extends TestBase { assertEval("{ diag(1, 2, 7) }"); } + @Test + public void TestSimpleBuiltins_testDiff_f0ac3bed06cb4b5646da1f73e78291f8() { + assertEval("{ diff(1:10, 2) }"); + } + + @Test + public void TestSimpleBuiltins_testDiff_7b31177c1f34b8a05962fdbb5b777fde() { + assertEval("{ diff(1:10, 2, 2) }"); + } + + @Test + public void TestSimpleBuiltins_testDiff_3715f48e2640f2039090554c74f88ddc() { + assertEval("{ x <- cumsum(cumsum(1:10)) ; diff(x, lag = 2) }"); + } + + @Test + public void TestSimpleBuiltins_testDiff_e72d1cda19e760416d19b9192a7a2321() { + assertEval("{ x <- cumsum(cumsum(1:10)) ; diff(x, differences = 2) }"); + } + @Test public void TestSimpleBuiltins_testDimensions_0c23ecb60a78eddaab4dced71193f975() { assertEval("{ dim(1) }"); diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/simple/TestSimpleBuiltins.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/simple/TestSimpleBuiltins.java index 68833617bae571c1586cca8a43ff7fdfe12b0aee..9398cf67381741b95c225e52de0dded9dd72f2de 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/simple/TestSimpleBuiltins.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/simple/TestSimpleBuiltins.java @@ -3956,4 +3956,12 @@ public class TestSimpleBuiltins extends TestBase { assertEval("{x<-gl(2, 1, 20); print(x)}"); assertEval("{x<-gl(2, 2, 20); print(x)}"); } + + @Test + public void testDiff() { + assertEval("{ diff(1:10, 2) }"); + assertEval("{ diff(1:10, 2, 2) }"); + assertEval("{ x <- cumsum(cumsum(1:10)) ; diff(x, lag = 2) }"); + assertEval("{ x <- cumsum(cumsum(1:10)) ; diff(x, differences = 2) }"); + } }