From ae20b19d1711260dd7a3f88ecf603971f6e1a236 Mon Sep 17 00:00:00 2001
From: stepan <stepan.sindelar@oracle.com>
Date: Tue, 2 Jan 2018 18:51:12 +0100
Subject: [PATCH] Fix of '.' handling in formulas

---
 .../oracle/truffle/r/library/stats/model.R    | 13 ++++++----
 .../truffle/r/test/ExpectedTestOutput.test    | 24 +++++++++++++++++++
 .../r/test/library/stats/TestFormulae.java    | 10 ++++++++
 3 files changed, 43 insertions(+), 4 deletions(-)

diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/model.R b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/model.R
index 2175ac8d65..5827c72a33 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/model.R
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/model.R
@@ -502,9 +502,10 @@ replaceDots <- function(x, replacement) {
         }
         return(x)
     }
-
-    for (i in seq_along(x)) {
-        x[[i]] <- replaceDots(x[[i]], replacement);
+    if (is.language(x)) {
+        for (i in seq_along(x)) {
+            x[[i]] <- replaceDots(x[[i]], replacement);
+        }
     }
     x
 }
@@ -682,7 +683,11 @@ termsform <- function (x.in, specials, data, keep.order, allowDotAsName) {
     # Step 6: Fix up the formula by substituting for dot, which should be
     # the framenames joined by +
     if (haveDot) {
-      x <- ExpandDots(x, framenames)
+        if (length(framenames) > 0) {
+            x <- ExpandDots(x, framenames)
+        } else if (!allowDotAsName) {
+           error("'.' in formula and no 'data' argument")
+        }
     }
     
     attr(x, "order") <- ord
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 36982bf2ae..1589d9a470 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
@@ -161126,6 +161126,30 @@ attr(,"assign")
 15 2 2 99.190
 16 2 2 16.000
 
+##com.oracle.truffle.r.test.library.stats.TestFormulae.testDotWithData#
+#terms.formula(x ~ .^4, data=data.frame(1:5))
+x ~ X1.5^4
+attr(,"variables")
+list(x, X1.5)
+attr(,"factors")
+     X1.5
+x       0
+X1.5    1
+attr(,"term.labels")
+[1] "X1.5"
+attr(,"order")
+[1] 1
+attr(,"intercept")
+[1] 1
+attr(,"response")
+[1] 1
+attr(,".Environment")
+<environment: R_GlobalEnv>
+
+##com.oracle.truffle.r.test.library.stats.TestFormulae.testDotWithNoFramenames#Output.IgnoreErrorContext#
+#terms.formula(x ~ .^4)
+Error in terms.formula(x ~ .^4) : '.' in formula and no 'data' argument
+
 ##com.oracle.truffle.r.test.library.stats.TestFormulae.testExpandDostsAndSpecialsTermsform#
 #f <- terms.formula(cyl~myfun(mpg)+., specials=c('myfun'), data=mtcars); attrs <- attributes(f); envIdx <- which(names(attrs)=='.Environment'); print(attrs[envIdx]); attrs[sort(names(attrs[-envIdx]))]
 $.Environment
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/TestFormulae.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/TestFormulae.java
index 76faa10ddb..06692c4ac6 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/TestFormulae.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/TestFormulae.java
@@ -105,4 +105,14 @@ public class TestFormulae extends TestBase {
     public void testExpandDostsAndSpecialsTermsform() {
         assertEval("f <- terms.formula(cyl~myfun(mpg)+., specials=c('myfun'), data=mtcars); attrs <- attributes(f); " + SHOW_ATTRS);
     }
+
+    @Test
+    public void testDotWithData() {
+        assertEval("terms.formula(x ~ .^4, data=data.frame(1:5))");
+    }
+
+    @Test
+    public void testDotWithNoFramenames() {
+        assertEval(Output.IgnoreErrorContext, "terms.formula(x ~ .^4)");
+    }
 }
-- 
GitLab