You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zeppelin.apache.org by mo...@apache.org on 2016/04/05 10:03:31 UTC

[1/3] incubator-zeppelin git commit: R and SparkR Support [WIP]

Repository: incubator-zeppelin
Updated Branches:
  refs/heads/master d5e87fb8b -> 7d6cc7e99


http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/7d6cc7e9/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 76f4a31..c7d9312 100755
--- a/pom.xml
+++ b/pom.xml
@@ -17,7 +17,7 @@
   -->
 
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.maven-v4_0_0.xsd">
 
   <!-- Licensed to the Apache Software Foundation (ASF) under one or more
     contributor license agreements. See the NOTICE file distributed with this

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/7d6cc7e9/spark-dependencies/pom.xml
----------------------------------------------------------------------
diff --git a/spark-dependencies/pom.xml b/spark-dependencies/pom.xml
index 02d24e2..8e23f22 100644
--- a/spark-dependencies/pom.xml
+++ b/spark-dependencies/pom.xml
@@ -54,6 +54,7 @@
     <spark.download.url>
       http://archive.apache.org/dist/spark/${spark.archive}/${spark.archive}.tgz
     </spark.download.url>
+    <spark.bin.download.url>http://archive.apache.org/dist/spark/spark-${spark.version}/spark-${spark.version}-bin-without-hadoop.tgz</spark.bin.download.url>
     <spark.dist.cache>${project.build.directory}/../../.spark-dist</spark.dist.cache>
     <py4j.version>0.8.2.1</py4j.version>
   </properties>
@@ -802,10 +803,10 @@
             <configuration>
               <filesets>
                 <fileset>
-                  <directory>${basedir}/../python/build</directory>
+                  <directory>${project.build.directory}/spark-dist</directory>
                 </fileset>
                 <fileset>
-                  <directory>${project.build.directory}/spark-dist</directory>
+                  <directory>${basedir}/../python/build</directory>
                 </fileset>
               </filesets>
             </configuration>
@@ -844,7 +845,65 @@
                     <zip destfile="${project.build.directory}/../../interpreter/spark/pyspark/pyspark.zip"
                          basedir="${project.build.directory}/spark-dist/${spark.archive}/python"
                          includes="pyspark/*.py,pyspark/**/*.py"/>
-                  </target>
+                  </target>                
+                </configuration>
+              </execution>
+            </executions>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+
+    <profile>
+      <id>sparkr</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>com.googlecode.maven-download-plugin</groupId>
+            <artifactId>download-maven-plugin</artifactId>
+            <version>1.2.1</version>
+            <executions>
+              <execution>
+                <id>download-sparkr-files</id>
+                <phase>validate</phase>
+                <goals>
+                  <goal>wget</goal>
+                </goals>
+                <configuration>
+                  <url>${spark.bin.download.url}</url>
+                  <unpack>true</unpack>
+                  <outputDirectory>${project.build.directory}/spark-bin-dist</outputDirectory>
+                </configuration>
+              </execution>
+            </executions>
+          </plugin>
+          <plugin>
+            <artifactId>maven-clean-plugin</artifactId>
+            <configuration>
+              <filesets>
+                <fileset>
+                  <directory>${project.build.directory}/spark-bin-dist</directory>
+                </fileset>
+              </filesets>
+            </configuration>
+          </plugin>
+          <plugin>
+            <artifactId>maven-resources-plugin</artifactId>
+            <version>2.7</version>
+            <executions>
+              <execution>
+                <id>copy-sparkr-files</id>
+                <phase>generate-resources</phase>
+                <goals>
+                  <goal>copy-resources</goal>
+                </goals>
+                <configuration>
+                  <outputDirectory>${project.build.directory}/../../interpreter/spark/R/lib</outputDirectory>
+                  <resources>
+                    <resource>
+                      <directory>${project.build.directory}/spark-bin-dist/spark-${spark.version}-bin-without-hadoop/R/lib</directory>
+                    </resource>
+                  </resources>
                 </configuration>
               </execution>
             </executions>
@@ -852,6 +911,7 @@
         </plugins>
       </build>
     </profile>
+    
   </profiles>
 
   <build>

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/7d6cc7e9/spark/pom.xml
----------------------------------------------------------------------
diff --git a/spark/pom.xml b/spark/pom.xml
index ece7467..3b88f3b 100644
--- a/spark/pom.xml
+++ b/spark/pom.xml
@@ -35,12 +35,14 @@
   <url>http://zeppelin.incubator.apache.org</url>
 
   <properties>
+    <jsoup.version>1.8.2</jsoup.version>
+    <mockito.version>1.10.19</mockito.version>
+    <powermock.version>1.6.4</powermock.version>
     <spark.version>1.4.1</spark.version>
     <scala.version>2.10.4</scala.version>
     <scala.binary.version>2.10</scala.binary.version>
   </properties>
 
-
   <dependencies>
     <dependency>
       <groupId>org.slf4j</groupId>
@@ -231,6 +233,12 @@
       <scope>provided</scope>
     </dependency>
 
+    <dependency>
+      <groupId>org.jsoup</groupId>
+      <artifactId>jsoup</artifactId>
+      <version>${jsoup.version}</version>
+    </dependency>
+
     <!--TEST-->
     <dependency>
       <groupId>org.scalatest</groupId>
@@ -266,6 +274,25 @@
       <scope>test</scope>
     </dependency>
 
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-core</artifactId>
+      <version>${mockito.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.powermock</groupId>
+      <artifactId>powermock-api-mockito</artifactId>
+      <version>${powermock.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.powermock</groupId>
+      <artifactId>powermock-module-junit4</artifactId>
+      <version>${powermock.version}</version>
+      <scope>test</scope>
+    </dependency>
+
   </dependencies>
 
   <build>
@@ -285,7 +312,7 @@
             <exclude>**/derby.log</exclude>
             <exclude>**/metastore_db/</exclude>
             <exclude>**/README.md</exclude>
-            <exclude>dependency-reduced-pom.xml</exclude>
+            <exclude>**/dependency-reduced-pom.xml</exclude>
           </excludes>
         </configuration>
       </plugin>
@@ -403,4 +430,56 @@
 
     </plugins>
   </build>
+
+  <profiles>
+
+    <!-- to deactivate 'exclude-sparkr' automatically when 'spark' is activated -->
+    <profile>
+      <id>sparkr</id>
+    </profile>
+
+    <profile>
+      <id>exclude-sparkr</id>
+      <activation>
+        <activeByDefault>true</activeByDefault>
+      </activation>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-compiler-plugin</artifactId>
+            <configuration>
+              <excludes>
+                <exclude>**/SparkRInterpreter.java</exclude>
+              </excludes>
+              <testExcludes>
+                <testExclude>**/SparkRInterpreterTest.java</testExclude>
+                <testExclude>**/ZeppelinRTest.java</testExclude>
+              </testExcludes>
+            </configuration>
+          </plugin>
+          <plugin>
+            <groupId>org.scala-tools</groupId>
+            <artifactId>maven-scala-plugin</artifactId>
+            <configuration>
+              <excludes>
+                <exclude>**/ZeppelinR.scala</exclude>
+                <exclude>**/SparkRBackend.scala</exclude>
+              </excludes>
+            </configuration>
+          </plugin>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-surefire-plugin</artifactId>
+            <configuration>
+              <excludes>
+                <exclude>**/SparkRInterpreterTest.java</exclude>
+              </excludes>
+            </configuration>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
+
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/7d6cc7e9/spark/src/main/java/org/apache/zeppelin/spark/SparkRInterpreter.java
----------------------------------------------------------------------
diff --git a/spark/src/main/java/org/apache/zeppelin/spark/SparkRInterpreter.java b/spark/src/main/java/org/apache/zeppelin/spark/SparkRInterpreter.java
new file mode 100644
index 0000000..e0ea766
--- /dev/null
+++ b/spark/src/main/java/org/apache/zeppelin/spark/SparkRInterpreter.java
@@ -0,0 +1,226 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.zeppelin.spark;
+
+import static org.apache.zeppelin.spark.ZeppelinRDisplay.render;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.spark.SparkRBackend;
+import org.apache.zeppelin.interpreter.*;
+import org.apache.zeppelin.scheduler.Scheduler;
+import org.apache.zeppelin.scheduler.SchedulerFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+/**
+ * R and SparkR interpreter with visualization support.
+ */
+public class SparkRInterpreter extends Interpreter {
+  private static final Logger logger = LoggerFactory.getLogger(SparkRInterpreter.class);
+
+  private static String renderOptions;
+  private ZeppelinR zeppelinR;
+
+  static {
+    Interpreter.register(
+      "r",
+      "spark",
+      SparkRInterpreter.class.getName(),
+      new InterpreterPropertyBuilder()
+          .add("zeppelin.R.cmd",
+              SparkInterpreter.getSystemDefault("ZEPPELIN_R_CMD", "zeppelin.R.cmd", "R"),
+              "R repl path")
+          .add("zeppelin.R.knitr",
+              SparkInterpreter.getSystemDefault("ZEPPELIN_R_KNITR", "zeppelin.R.knitr", "true"),
+              "whether use knitr or not")
+          .add("zeppelin.R.image.width",
+              SparkInterpreter.getSystemDefault("ZEPPELIN_R_IMAGE_WIDTH",
+                  "zeppelin.R.image.width", "100%"),
+              "")
+          .add("zeppelin.R.render.options",
+              SparkInterpreter.getSystemDefault("ZEPPELIN_R_RENDER_OPTIONS",
+                  "zeppelin.R.render.options",
+                  "out.format = 'html', comment = NA, "
+                      + "echo = FALSE, results = 'asis', message = F, warning = F"),
+              "")
+          .build());
+  }
+
+
+  public SparkRInterpreter(Properties property) {
+    super(property);
+  }
+
+  @Override
+  public void open() {
+    String rCmdPath = getProperty("zeppelin.R.cmd");
+    String sparkRLibPath;
+
+    if (System.getenv("SPARK_HOME") != null) {
+      sparkRLibPath = System.getenv("SPARK_HOME") + "/R/lib";
+    } else {
+      sparkRLibPath = System.getenv("ZEPPELIN_HOME") + "/interpreter/spark/R/lib";
+      // workaround to make sparkr work without SPARK_HOME
+      System.setProperty("spark.test.home", System.getenv("ZEPPELIN_HOME") + "/interpreter/spark");
+    }
+
+    synchronized (SparkRBackend.backend()) {
+      if (!SparkRBackend.isStarted()) {
+        SparkRBackend.init();
+        SparkRBackend.start();
+      }
+    }
+
+    int port = SparkRBackend.port();
+
+    SparkInterpreter sparkInterpreter = getSparkInterpreter();
+    ZeppelinRContext.setSparkContext(sparkInterpreter.getSparkContext());
+    ZeppelinRContext.setSqlContext(sparkInterpreter.getSQLContext());
+    ZeppelinRContext.setZepplinContext(sparkInterpreter.getZeppelinContext());
+
+    zeppelinR = new ZeppelinR(rCmdPath, sparkRLibPath, port);
+    try {
+      zeppelinR.open();
+    } catch (IOException e) {
+      logger.error("Exception while opening SparkRInterpreter", e);
+      throw new InterpreterException(e);
+    }
+
+    if (useKnitr()) {
+      zeppelinR.eval("library('knitr')");
+    }
+    renderOptions = getProperty("zeppelin.R.render.options");
+  }
+
+  @Override
+  public InterpreterResult interpret(String lines, InterpreterContext interpreterContext) {
+
+    String imageWidth = getProperty("zeppelin.R.image.width");
+
+    String[] sl = lines.split("\n");
+    if (sl[0].contains("{") && sl[0].contains("}")) {
+      String jsonConfig = sl[0].substring(sl[0].indexOf("{"), sl[0].indexOf("}") + 1);
+      ObjectMapper m = new ObjectMapper();
+      try {
+        JsonNode rootNode = m.readTree(jsonConfig);
+        JsonNode imageWidthNode = rootNode.path("imageWidth");
+        if (!imageWidthNode.isMissingNode()) imageWidth = imageWidthNode.textValue();
+      }
+      catch (Exception e) {
+        logger.warn("Can not parse json config: " + jsonConfig, e);
+      }
+      finally {
+        lines = lines.replace(jsonConfig, "");
+      }
+    }
+
+    try {
+      // render output with knitr
+      if (useKnitr()) {
+        zeppelinR.setInterpreterOutput(null);
+        zeppelinR.set(".zcmd", "\n```{r " + renderOptions + "}\n" + lines + "\n```");
+        zeppelinR.eval(".zres <- knit2html(text=.zcmd)");
+        String html = zeppelinR.getS0(".zres");
+
+        RDisplay rDisplay = render(html, imageWidth);
+
+        return new InterpreterResult(
+            rDisplay.code(),
+            rDisplay.type(),
+            rDisplay.content()
+        );
+      } else {
+        // alternatively, stream the output (without knitr)
+        zeppelinR.setInterpreterOutput(interpreterContext.out);
+        zeppelinR.eval(lines);
+        return new InterpreterResult(InterpreterResult.Code.SUCCESS, "");
+      }
+    } catch (Exception e) {
+      logger.error("Exception while connecting to R", e);
+      return new InterpreterResult(InterpreterResult.Code.ERROR, e.getMessage());
+    } finally {
+      try {
+      } catch (Exception e) {
+        // Do nothing...
+      }
+    }
+  }
+
+  @Override
+  public void close() {
+    zeppelinR.close();
+  }
+
+  @Override
+  public void cancel(InterpreterContext context) {}
+
+  @Override
+  public FormType getFormType() {
+    return FormType.NONE;
+  }
+
+  @Override
+  public int getProgress(InterpreterContext context) {
+    return 0;
+  }
+
+  @Override
+  public Scheduler getScheduler() {
+    return SchedulerFactory.singleton().createOrGetFIFOScheduler(
+            SparkRInterpreter.class.getName() + this.hashCode());
+  }
+
+  @Override
+  public List<String> completion(String buf, int cursor) {
+    return new ArrayList<String>();
+  }
+
+  private SparkInterpreter getSparkInterpreter() {
+    LazyOpenInterpreter lazy = null;
+    SparkInterpreter spark = null;
+    Interpreter p = getInterpreterInTheSameSessionByClassName(SparkInterpreter.class.getName());
+
+    while (p instanceof WrappedInterpreter) {
+      if (p instanceof LazyOpenInterpreter) {
+        lazy = (LazyOpenInterpreter) p;
+      }
+      p = ((WrappedInterpreter) p).getInnerInterpreter();
+    }
+    spark = (SparkInterpreter) p;
+
+    if (lazy != null) {
+      lazy.open();
+    }
+    return spark;
+  }
+
+  private boolean useKnitr() {
+    try {
+      return Boolean.parseBoolean(getProperty("zeppelin.R.knitr"));
+    } catch (Exception e) {
+      return false;
+    }
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/7d6cc7e9/spark/src/main/java/org/apache/zeppelin/spark/ZeppelinR.java
----------------------------------------------------------------------
diff --git a/spark/src/main/java/org/apache/zeppelin/spark/ZeppelinR.java b/spark/src/main/java/org/apache/zeppelin/spark/ZeppelinR.java
new file mode 100644
index 0000000..8d92c96
--- /dev/null
+++ b/spark/src/main/java/org/apache/zeppelin/spark/ZeppelinR.java
@@ -0,0 +1,404 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.zeppelin.spark;
+
+import org.apache.commons.exec.*;
+import org.apache.commons.exec.environment.EnvironmentUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.zeppelin.interpreter.InterpreterException;
+import org.apache.zeppelin.interpreter.InterpreterOutput;
+import org.apache.zeppelin.interpreter.InterpreterOutputListener;
+import parquet.org.slf4j.Logger;
+import parquet.org.slf4j.LoggerFactory;
+
+import java.io.*;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * R repl interaction
+ */
+public class ZeppelinR implements ExecuteResultHandler {
+  Logger logger = LoggerFactory.getLogger(ZeppelinR.class);
+  private final String rCmdPath;
+  private DefaultExecutor executor;
+  private SparkOutputStream outputStream;
+  private PipedOutputStream input;
+  private final String scriptPath;
+  private final String libPath;
+  static Map<Integer, ZeppelinR> zeppelinR = Collections.synchronizedMap(
+      new HashMap<Integer, ZeppelinR>());
+
+  private InterpreterOutput initialOutput;
+  private final int port;
+  private boolean rScriptRunning;
+
+  /**
+   * To be notified R repl initialization
+   */
+  boolean rScriptInitialized = false;
+  Integer rScriptInitializeNotifier = new Integer(0);
+
+
+  /**
+   * Request to R repl
+   */
+  Request rRequestObject = null;
+  Integer rRequestNotifier = new Integer(0);
+
+  /**
+   * Request object
+   *
+   * type : "eval", "set", "get"
+   * stmt : statement to evaluate when type is "eval"
+   *        key when type is "set" or "get"
+   * value : value object when type is "put"
+   */
+  public static class Request {
+    String type;
+    String stmt;
+    Object value;
+
+    public Request(String type, String stmt, Object value) {
+      this.type = type;
+      this.stmt = stmt;
+      this.value = value;
+    }
+
+    public String getType() {
+      return type;
+    }
+
+    public String getStmt() {
+      return stmt;
+    }
+
+    public Object getValue() {
+      return value;
+    }
+  }
+
+  /**
+   * Response from R repl
+   */
+  Object rResponseValue = null;
+  boolean rResponseError = false;
+  Integer rResponseNotifier = new Integer(0);
+
+
+
+  /**
+   * Create ZeppelinR instance
+   * @param rCmdPath R repl commandline path
+   * @param libPath sparkr library path
+   */
+  public ZeppelinR(String rCmdPath, String libPath, int sparkRBackendPort) {
+    this.rCmdPath = rCmdPath;
+    this.libPath = libPath;
+    this.port = sparkRBackendPort;
+    scriptPath = System.getProperty("java.io.tmpdir") + "/zeppelin_sparkr.R";
+
+  }
+
+  /**
+   * Start R repl
+   * @throws IOException
+   */
+  public void open() throws IOException {
+    createRScript();
+
+    zeppelinR.put(hashCode(), this);
+
+    CommandLine cmd = CommandLine.parse(rCmdPath);
+    cmd.addArgument("--no-save");
+    cmd.addArgument("--no-restore");
+    cmd.addArgument("-f");
+    cmd.addArgument(scriptPath);
+    cmd.addArgument("--args");
+    cmd.addArgument(Integer.toString(hashCode()));
+    cmd.addArgument(Integer.toString(port));
+    cmd.addArgument(libPath);
+
+    executor = new DefaultExecutor();
+    outputStream = new SparkOutputStream();
+
+    input = new PipedOutputStream();
+    PipedInputStream in = new PipedInputStream(input);
+
+    PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream, outputStream, in);
+    executor.setWatchdog(new ExecuteWatchdog(ExecuteWatchdog.INFINITE_TIMEOUT));
+    executor.setStreamHandler(streamHandler);
+    Map env = EnvironmentUtils.getProcEnvironment();
+
+
+    initialOutput = new InterpreterOutput(new InterpreterOutputListener() {
+      @Override
+      public void onAppend(InterpreterOutput out, byte[] line) {
+        logger.debug(new String(line));
+      }
+
+      @Override
+      public void onUpdate(InterpreterOutput out, byte[] output) {
+      }
+    });
+    outputStream.setInterpreterOutput(initialOutput);
+    executor.execute(cmd, env, this);
+    rScriptRunning = true;
+
+    // flush output
+    eval("cat('')");
+  }
+
+  /**
+   * Evaluate expression
+   * @param expr
+   * @return
+   */
+  public Object eval(String expr) {
+    synchronized (this) {
+      rRequestObject = new Request("eval", expr, null);
+      return request();
+    }
+  }
+
+  /**
+   * assign value to key
+   * @param key
+   * @param value
+   */
+  public void set(String key, Object value) {
+    synchronized (this) {
+      rRequestObject = new Request("set", key, value);
+      request();
+    }
+  }
+
+  /**
+   * get value of key
+   * @param key
+   * @return
+   */
+  public Object get(String key) {
+    synchronized (this) {
+      rRequestObject = new Request("get", key, null);
+      return request();
+    }
+  }
+
+  /**
+   * get value of key, as a string
+   * @param key
+   * @return
+   */
+  public String getS0(String key) {
+    synchronized (this) {
+      rRequestObject = new Request("getS", key, null);
+      return (String) request();
+    }
+  }
+
+
+  /**
+   * Send request to r repl and return response
+   * @return responseValue
+   */
+  private Object request() throws RuntimeException {
+    if (!rScriptRunning) {
+      throw new RuntimeException("r repl is not running");
+    }
+
+    // wait for rscript initialized
+    if (!rScriptInitialized) {
+      waitForRScriptInitialized();
+    }
+
+    rResponseValue = null;
+
+    synchronized (rRequestNotifier) {
+      rRequestNotifier.notify();
+    }
+
+    Object respValue = null;
+    synchronized (rResponseNotifier) {
+      while (rResponseValue == null && rScriptRunning) {
+        try {
+          rResponseNotifier.wait(1000);
+        } catch (InterruptedException e) {
+          logger.error(e.getMessage(), e);
+        }
+      }
+      respValue = rResponseValue;
+      rResponseValue = null;
+    }
+
+    if (rResponseError) {
+      throw new RuntimeException(respValue.toString());
+    } else {
+      return respValue;
+    }
+  }
+
+
+  /**
+   * Wait until src/main/resources/R/zeppelin_sparkr.R is initialized
+   * and call onScriptInitialized()
+   *
+   * @throws InterpreterException
+   */
+  private void waitForRScriptInitialized() throws InterpreterException {
+    synchronized (rScriptInitializeNotifier) {
+      long startTime = System.nanoTime();
+      while (rScriptInitialized == false &&
+          rScriptRunning &&
+          System.nanoTime() - startTime < 10L * 1000 * 1000000) {
+        try {
+          rScriptInitializeNotifier.wait(1000);
+        } catch (InterruptedException e) {
+          logger.error(e.getMessage(), e);
+        }
+      }
+    }
+
+    String errorMessage = "";
+    try {
+      initialOutput.flush();
+      errorMessage = new String(initialOutput.toByteArray());
+    } catch (IOException e) {
+      e.printStackTrace();
+    }
+
+
+    if (rScriptInitialized == false) {
+      throw new InterpreterException("sparkr is not responding " + errorMessage);
+    }
+  }
+
+
+
+  /**
+   * invoked by src/main/resources/R/zeppelin_sparkr.R
+   * @return
+   */
+  public Request getRequest() {
+    synchronized (rRequestNotifier) {
+      while (rRequestObject == null) {
+        try {
+          rRequestNotifier.wait(1000);
+        } catch (InterruptedException e) {
+          logger.error(e.getMessage(), e);
+        }
+      }
+
+      Request req = rRequestObject;
+      rRequestObject = null;
+      return req;
+    }
+  }
+
+  /**
+   * invoked by src/main/resources/R/zeppelin_sparkr.R
+   * @param value
+   * @param error
+   */
+  public void setResponse(Object value, boolean error) {
+    synchronized (rResponseNotifier) {
+      rResponseValue = value;
+      rResponseError = error;
+      rResponseNotifier.notify();
+    }
+  }
+
+  /**
+   * invoked by src/main/resources/R/zeppelin_sparkr.R
+   */
+  public void onScriptInitialized() {
+    synchronized (rScriptInitializeNotifier) {
+      rScriptInitialized = true;
+      rScriptInitializeNotifier.notifyAll();
+    }
+  }
+
+
+  /**
+   * Create R script in tmp dir
+   */
+  private void createRScript() {
+    ClassLoader classLoader = getClass().getClassLoader();
+    File out = new File(scriptPath);
+
+    if (out.exists() && out.isDirectory()) {
+      throw new InterpreterException("Can't create r script " + out.getAbsolutePath());
+    }
+
+    try {
+      FileOutputStream outStream = new FileOutputStream(out);
+      IOUtils.copy(
+          classLoader.getResourceAsStream("R/zeppelin_sparkr.R"),
+          outStream);
+      outStream.close();
+    } catch (IOException e) {
+      throw new InterpreterException(e);
+    }
+
+    logger.info("File {} created", scriptPath);
+  }
+
+  /**
+   * Terminate this R repl
+   */
+  public void close() {
+    executor.getWatchdog().destroyProcess();
+    new File(scriptPath).delete();
+    zeppelinR.remove(hashCode());
+  }
+
+  /**
+   * Get instance
+   * This method will be invoded from zeppelin_sparkr.R
+   * @param hashcode
+   * @return
+   */
+  public static ZeppelinR getZeppelinR(int hashcode) {
+    return zeppelinR.get(hashcode);
+  }
+
+
+  /**
+   * Pass InterpreterOutput to capture the repl output
+   * @param out
+   */
+  public void setInterpreterOutput(InterpreterOutput out) {
+    outputStream.setInterpreterOutput(out);
+  }
+
+
+
+  @Override
+  public void onProcessComplete(int i) {
+    logger.info("process complete {}", i);
+    rScriptRunning = false;
+  }
+
+  @Override
+  public void onProcessFailed(ExecuteException e) {
+    logger.error(e.getMessage(), e);
+    rScriptRunning = false;
+  }
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/7d6cc7e9/spark/src/main/java/org/apache/zeppelin/spark/ZeppelinRContext.java
----------------------------------------------------------------------
diff --git a/spark/src/main/java/org/apache/zeppelin/spark/ZeppelinRContext.java b/spark/src/main/java/org/apache/zeppelin/spark/ZeppelinRContext.java
new file mode 100644
index 0000000..82c320d
--- /dev/null
+++ b/spark/src/main/java/org/apache/zeppelin/spark/ZeppelinRContext.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.zeppelin.spark;
+
+import org.apache.spark.SparkContext;
+import org.apache.spark.sql.SQLContext;
+
+/**
+ * Contains the Spark and Zeppelin Contexts made available to SparkR.
+ */
+public class ZeppelinRContext {
+  private static SparkContext sparkContext;
+  private static SQLContext sqlContext;
+  private static ZeppelinContext zeppelinContext;
+
+  public static void setSparkContext(SparkContext sparkContext) {
+    ZeppelinRContext.sparkContext = sparkContext;
+  }
+
+  public static void setZepplinContext(ZeppelinContext zeppelinContext) {
+    ZeppelinRContext.zeppelinContext = zeppelinContext;
+  }
+
+  public static void setSqlContext(SQLContext sqlContext) {
+    ZeppelinRContext.sqlContext = sqlContext;
+  }
+
+  public static SparkContext getSparkContext() {
+    return sparkContext;
+  }
+
+  public static SQLContext getSqlContext() {
+    return sqlContext;
+  }
+
+  public static ZeppelinContext getZeppelinContext() {
+    return zeppelinContext;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/7d6cc7e9/spark/src/main/resources/R/zeppelin_sparkr.R
----------------------------------------------------------------------
diff --git a/spark/src/main/resources/R/zeppelin_sparkr.R b/spark/src/main/resources/R/zeppelin_sparkr.R
new file mode 100644
index 0000000..fe2a16b
--- /dev/null
+++ b/spark/src/main/resources/R/zeppelin_sparkr.R
@@ -0,0 +1,99 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+args <- commandArgs(trailingOnly = TRUE)
+
+hashCode <- as.integer(args[1])
+port <- as.integer(args[2])
+libPath <- args[3]
+rm(args)
+
+print(paste("Port ", toString(port)))
+print(paste("LibPath ", libPath))
+
+.libPaths(c(file.path(libPath), .libPaths()))
+library(SparkR)
+
+
+SparkR:::connectBackend("localhost", port)
+
+# scStartTime is needed by R/pkg/R/sparkR.R
+assign(".scStartTime", as.integer(Sys.time()), envir = SparkR:::.sparkREnv)
+
+# getZeppelinR
+.zeppelinR = SparkR:::callJStatic("org.apache.zeppelin.spark.ZeppelinR", "getZeppelinR", hashCode)
+
+# setup spark env
+assign(".sc", SparkR:::callJStatic("org.apache.zeppelin.spark.ZeppelinRContext", "getSparkContext"), envir = SparkR:::.sparkREnv)
+assign("sc", get(".sc", envir = SparkR:::.sparkREnv), envir=.GlobalEnv)
+assign(".sqlc", SparkR:::callJStatic("org.apache.zeppelin.spark.ZeppelinRContext", "getSqlContext"), envir = SparkR:::.sparkREnv)
+assign("sqlContext", get(".sqlc", envir = SparkR:::.sparkREnv), envir = .GlobalEnv)
+assign(".zeppelinContext", SparkR:::callJStatic("org.apache.zeppelin.spark.ZeppelinRContext", "getZeppelinContext"), envir = .GlobalEnv)
+
+z.put <- function(name, object) {
+  SparkR:::callJMethod(.zeppelinContext, "put", name, object)
+}
+z.get <- function(name) {
+  SparkR:::callJMethod(.zeppelinContext, "get", name)
+}
+z.input <- function(name, value) {
+  SparkR:::callJMethod(.zeppelinContext, "input", name, value)
+}
+
+# notify script is initialized
+SparkR:::callJMethod(.zeppelinR, "onScriptInitialized")
+
+while (TRUE) {
+  req <- SparkR:::callJMethod(.zeppelinR, "getRequest")
+  type <-  SparkR:::callJMethod(req, "getType")
+  stmt <- SparkR:::callJMethod(req, "getStmt")
+  value <- SparkR:::callJMethod(req, "getValue")
+  
+  if (type == "eval") {
+    tryCatch({
+      ret <- eval(parse(text=stmt))
+      SparkR:::callJMethod(.zeppelinR, "setResponse", "", FALSE)
+    }, error = function(e) {
+      SparkR:::callJMethod(.zeppelinR, "setResponse", toString(e), TRUE)
+    })    
+  } else if (type == "set") {
+    tryCatch({
+      ret <- assign(stmt, value)
+      SparkR:::callJMethod(.zeppelinR, "setResponse", "", FALSE)
+    }, error = function(e) {
+      SparkR:::callJMethod(.zeppelinR, "setResponse", toString(e), TRUE)
+    })
+  } else if (type == "get") {
+    tryCatch({      
+      ret <- eval(parse(text=stmt))
+      SparkR:::callJMethod(.zeppelinR, "setResponse", ret, FALSE)
+    }, error = function(e) {
+      SparkR:::callJMethod(.zeppelinR, "setResponse", toString(e), TRUE)
+    })
+  } else if (type == "getS") {
+    tryCatch({
+      ret <- eval(parse(text=stmt))
+      SparkR:::callJMethod(.zeppelinR, "setResponse", toString(ret), FALSE)
+    }, error = function(e) {
+      SparkR:::callJMethod(.zeppelinR, "setResponse", toString(e), TRUE)
+    })
+  } else {
+    # unsupported type
+    SparkR:::callJMethod(.zeppelinR, "setResponse", paste("Unsupported type ", type), TRUE)
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/7d6cc7e9/spark/src/main/scala/org/apache/spark/SparkRBackend.scala
----------------------------------------------------------------------
diff --git a/spark/src/main/scala/org/apache/spark/SparkRBackend.scala b/spark/src/main/scala/org/apache/spark/SparkRBackend.scala
new file mode 100644
index 0000000..05f1ac0
--- /dev/null
+++ b/spark/src/main/scala/org/apache/spark/SparkRBackend.scala
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.spark
+
+import org.apache.spark.api.r.RBackend
+
+object SparkRBackend {
+  val backend : RBackend = new RBackend()
+  private var started = false;
+  private var portNumber = 0;
+
+  val backendThread : Thread = new Thread("SparkRBackend") {
+    override def run() {
+      backend.run()
+    }
+  }
+
+  def init() : Int = {
+    portNumber = backend.init()
+    portNumber
+  }
+
+  def start() : Unit = {
+    backendThread.start()
+    started = true
+  }
+
+  def close() : Unit = {
+    backend.close()
+    backendThread.join()
+  }
+
+  def isStarted() : Boolean = {
+    started
+  }
+
+  def port(): Int = {
+    return portNumber
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/7d6cc7e9/spark/src/main/scala/org/apache/zeppelin/spark/ZeppelinRDisplay.scala
----------------------------------------------------------------------
diff --git a/spark/src/main/scala/org/apache/zeppelin/spark/ZeppelinRDisplay.scala b/spark/src/main/scala/org/apache/zeppelin/spark/ZeppelinRDisplay.scala
new file mode 100644
index 0000000..8607226
--- /dev/null
+++ b/spark/src/main/scala/org/apache/zeppelin/spark/ZeppelinRDisplay.scala
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.zeppelin.spark
+
+import org.apache.zeppelin.interpreter.InterpreterResult.Code
+import org.apache.zeppelin.interpreter.InterpreterResult.Code.{SUCCESS, ERROR}
+import org.apache.zeppelin.interpreter.InterpreterResult.Type
+import org.apache.zeppelin.interpreter.InterpreterResult.Type.{TEXT, HTML, TABLE, IMG}
+import org.jsoup.Jsoup
+import org.jsoup.nodes.Element
+import org.jsoup.nodes.Document
+
+import scala.collection.JavaConversions._
+
+import scala.util.matching.Regex
+
+case class RDisplay(content: String, `type`: Type, code: Code)
+
+object ZeppelinRDisplay {
+
+  val pattern = new Regex("""^ *\[\d*\] """)
+
+  def render(html: String, imageWidth: String): RDisplay = {
+
+    val document = Jsoup.parse(html)
+    document.outputSettings().prettyPrint(false)
+
+    val body = document.body()
+
+    if (body.getElementsByTag("p").isEmpty) return RDisplay(body.html(), HTML, SUCCESS)
+
+    val bodyHtml = body.html()
+
+    if (! bodyHtml.contains("<img")
+      &&  ! bodyHtml.contains("<script")
+      && ! bodyHtml.contains("%html ")
+      && ! bodyHtml.contains("%table ")
+      && ! bodyHtml.contains("%img ")
+    ) {
+      return textDisplay(body)
+    }
+
+    if (bodyHtml.contains("%table")) {
+      return tableDisplay(body)
+    }
+
+    if (bodyHtml.contains("%img")) {
+      return imgDisplay(body)
+    }
+
+    return htmlDisplay(body, imageWidth)
+
+  }
+
+  private def textDisplay(body: Element): RDisplay = {
+    RDisplay(body.getElementsByTag("p").get(0).html(), TEXT, SUCCESS)
+  }
+
+  private def tableDisplay(body: Element): RDisplay = {
+    val p = body.getElementsByTag("p").get(0).html.replace("“%table " , "").replace("”", "")
+    val r = (pattern findFirstIn p).getOrElse("")
+    val table = p.replace(r, "").replace("\\t", "\t").replace("\\n", "\n")
+    RDisplay(table, TABLE, SUCCESS)
+  }
+
+  private def imgDisplay(body: Element): RDisplay = {
+    val p = body.getElementsByTag("p").get(0).html.replace("“%img " , "").replace("”", "")
+    val r = (pattern findFirstIn p).getOrElse("")
+    val img = p.replace(r, "")
+    RDisplay(img, IMG, SUCCESS)
+  }
+
+  private def htmlDisplay(body: Element, imageWidth: String): RDisplay = {
+
+    var div = new String()
+
+    for (element <- body.children) {
+
+      val eHtml = element.html()
+      var eOuterHtml = element.outerHtml()
+
+      eOuterHtml = eOuterHtml.replace("“%html " , "").replace("”", "")
+
+      val r = (pattern findFirstIn eHtml).getOrElse("")
+
+      div = div + eOuterHtml.replace(r, "")
+
+    }
+
+    val content =  div
+      .replaceAll("src=\"//", "src=\"http://")
+      .replaceAll("href=\"//", "href=\"http://")
+
+    body.html(content)
+
+    for (image <- body.getElementsByTag("img")) {
+      image.attr("width", imageWidth)
+    }
+
+    RDisplay(body.html, HTML, SUCCESS)
+
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/7d6cc7e9/zeppelin-server/src/test/java/org/apache/zeppelin/rest/AbstractTestRestApi.java
----------------------------------------------------------------------
diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/AbstractTestRestApi.java b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/AbstractTestRestApi.java
index 81f161a..4c5cc5e 100644
--- a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/AbstractTestRestApi.java
+++ b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/AbstractTestRestApi.java
@@ -60,6 +60,7 @@ public abstract class AbstractTestRestApi {
   static final String url = getUrlToTest();
   protected static final boolean wasRunning = checkIfServerIsRunning();
   static boolean pySpark = false;
+  static boolean sparkR = false;
 
   private String getUrl(String path) {
     String url;
@@ -132,7 +133,7 @@ public abstract class AbstractTestRestApi {
         // set spark home for pyspark
         sparkIntpSetting.getProperties().setProperty("spark.home", getSparkHome());
         pySpark = true;
-
+        sparkR = true;
         ZeppelinServer.notebook.getInterpreterFactory().restart(sparkIntpSetting.id());
       } else {
         // assume first one is spark
@@ -148,6 +149,7 @@ public abstract class AbstractTestRestApi {
           // set spark home for pyspark
           sparkIntpSetting.getProperties().setProperty("spark.home", sparkHome);
           pySpark = true;
+          sparkR = true;
         }
 
         ZeppelinServer.notebook.getInterpreterFactory().restart(sparkIntpSetting.id());
@@ -174,6 +176,10 @@ public abstract class AbstractTestRestApi {
     return pySpark;
   }
 
+  boolean isSparkR() {
+    return sparkR;
+  }
+
   private static String getSparkHomeRecursively(File dir) {
     if (dir == null) return null;
     File files []  = dir.listFiles();

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/7d6cc7e9/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java
----------------------------------------------------------------------
diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java
index cdd1806..a928e97 100644
--- a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java
+++ b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java
@@ -84,6 +84,30 @@ public class ZeppelinSparkClusterTest extends AbstractTestRestApi {
     }
 
     @Test
+    public void sparkRTest() throws IOException {
+      // create new note
+      Note note = ZeppelinServer.notebook.createNote();
+      int sparkVersion = getSparkVersionNumber(note);
+
+      if (isSparkR() && sparkVersion >= 14) {   // sparkr supported from 1.4.0
+        // run markdown paragraph, again
+        Paragraph p = note.addParagraph();
+        Map config = p.getConfig();
+        config.put("enabled", true);
+        p.setConfig(config);
+        p.setText("%r localDF <- data.frame(name=c(\"a\", \"b\", \"c\"), age=c(19, 23, 18))\n" +
+            "df <- createDataFrame(sqlContext, localDF)\n" +
+            "count(df)"
+        );
+        note.run(p.getId());
+        waitForFinish(p);
+        assertEquals(Status.FINISHED, p.getStatus());
+        assertEquals("[1] 3", p.getResult().message());
+      }
+      ZeppelinServer.notebook.removeNote(note.id());
+    }
+
+    @Test
     public void pySparkTest() throws IOException {
         // create new note
         Note note = ZeppelinServer.notebook.createNote();
@@ -230,4 +254,4 @@ public class ZeppelinSparkClusterTest extends AbstractTestRestApi {
         int version = Integer.parseInt(split[0]) * 10 + Integer.parseInt(split[1]);
         return version;
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/7d6cc7e9/zeppelin-zengine/pom.xml
----------------------------------------------------------------------
diff --git a/zeppelin-zengine/pom.xml b/zeppelin-zengine/pom.xml
index 10a69a4..6c0275b 100644
--- a/zeppelin-zengine/pom.xml
+++ b/zeppelin-zengine/pom.xml
@@ -52,11 +52,11 @@
       <version>${project.version}</version>
     </dependency>
 
-	<dependency>
+    <dependency>
       <groupId>com.amazonaws</groupId>
       <artifactId>aws-java-sdk-s3</artifactId>
       <version>1.10.62</version>
-	</dependency>
+    </dependency>
 
     <dependency>
       <groupId>com.microsoft.azure</groupId>

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/7d6cc7e9/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java
----------------------------------------------------------------------
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java
index fc11a41..eafbbbe 100755
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java
@@ -451,6 +451,7 @@ public class ZeppelinConfiguration extends XMLConfiguration {
     ZEPPELIN_WAR_TEMPDIR("zeppelin.war.tempdir", "webapps"),
     ZEPPELIN_INTERPRETERS("zeppelin.interpreters", "org.apache.zeppelin.spark.SparkInterpreter,"
         + "org.apache.zeppelin.spark.PySparkInterpreter,"
+        + "org.apache.zeppelin.spark.SparkRInterpreter,"
         + "org.apache.zeppelin.spark.SparkSqlInterpreter,"
         + "org.apache.zeppelin.spark.DepInterpreter,"
         + "org.apache.zeppelin.markdown.Markdown,"

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/7d6cc7e9/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java
----------------------------------------------------------------------
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java
index 7df7bb3..269b54a 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java
@@ -379,10 +379,10 @@ public class InterpreterFactory {
       List<InterpreterSetting.InterpreterInfo> interpreterInfos =
           new LinkedList<InterpreterSetting.InterpreterInfo>();
 
-      for (RegisteredInterpreter registeredInterpreter :
-          Interpreter.registeredInterpreters.values()) {
-        if (registeredInterpreter.getGroup().equals(groupName)) {
-          for (String className : interpreterClassList) {
+      for (String className : interpreterClassList) {
+        for (RegisteredInterpreter registeredInterpreter :
+            Interpreter.registeredInterpreters.values()) {
+          if (registeredInterpreter.getGroup().equals(groupName)) {
             if (registeredInterpreter.getClassName().equals(className)) {
               interpreterInfos.add(
                   new InterpreterSetting.InterpreterInfo(



[2/3] incubator-zeppelin git commit: R and SparkR Support [WIP]

Posted by mo...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/7d6cc7e9/notebook/r/note.json
----------------------------------------------------------------------
diff --git a/notebook/r/note.json b/notebook/r/note.json
new file mode 100644
index 0000000..35c2bbb
--- /dev/null
+++ b/notebook/r/note.json
@@ -0,0 +1,1036 @@
+{
+  "paragraphs": [
+    {
+      "title": "Hello R",
+      "text": "%r\nfoo \u003c- TRUE\nprint(foo)\nbare \u003c- c(1, 2.5, 4)\nprint(bare)\ndouble \u003c- 15.0\nprint(double)",
+      "dateUpdated": "Feb 23, 2016 2:44:13 PM",
+      "config": {
+        "colWidth": 4.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {}
+        },
+        "editorMode": "ace/mode/scala",
+        "enabled": true,
+        "title": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "jobName": "paragraph_1429882946244_-381648689",
+      "id": "20150424-154226_261270952",
+      "result": {
+        "code": "SUCCESS",
+        "type": "TEXT",
+        "msg": "[1] TRUE\n[1] 1.0 2.5 4.0\n[1] 15"
+      },
+      "dateCreated": "Apr 24, 2015 3:42:26 PM",
+      "dateStarted": "Feb 23, 2016 2:44:13 PM",
+      "dateFinished": "Feb 23, 2016 2:44:55 PM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "title": "Load R Librairies",
+      "text": "%r\nlibrary(data.table)\ndt \u003c- data.table(1:3)\nprint(dt)\nfor (i in 1:5) {\n  print(i*2)\n}\nprint(1:50)",
+      "dateUpdated": "Feb 23, 2016 2:45:12 PM",
+      "config": {
+        "colWidth": 4.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {}
+        },
+        "editorMode": "ace/mode/scala",
+        "enabled": true,
+        "title": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "jobName": "paragraph_1429882976611_1352445253",
+      "id": "20150424-154256_645296307",
+      "result": {
+        "code": "SUCCESS",
+        "type": "TEXT",
+        "msg": "V1\n1:  1\n2:  2\n3:  3\n[1] 2\n[1] 4\n[1] 6\n[1] 8\n[1] 10\n [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23\n[24] 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46\n[47] 47 48 49 50"
+      },
+      "dateCreated": "Apr 24, 2015 3:42:56 PM",
+      "dateStarted": "Feb 23, 2016 2:45:13 PM",
+      "dateFinished": "Feb 23, 2016 2:45:13 PM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "title": "Load Iris Dataset",
+      "text": "%r\ncolnames(iris)\niris$Petal.Length\niris$Sepal.Length",
+      "dateUpdated": "Feb 23, 2016 2:45:14 PM",
+      "config": {
+        "colWidth": 4.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {}
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/scala",
+        "title": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "jobName": "paragraph_1455138077044_161383897",
+      "id": "20160210-220117_115873183",
+      "result": {
+        "code": "SUCCESS",
+        "type": "TEXT",
+        "msg": "[1] “Sepal.Length” “Sepal.Width”  “Petal.Length” “Petal.Width” \n[5] “Species”\u003cbr /\u003e\n  [1] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 1.5 1.6 1.4 1.1 1.2 1.5 1.3\n [18] 1.4 1.7 1.5 1.7 1.5 1.0 1.7 1.9 1.6 1.6 1.5 1.4 1.6 1.6 1.5 1.5 1.4\n [35] 1.5 1.2 1.3 1.4 1.3 1.5 1.3 1.3 1.3 1.6 1.9 1.4 1.6 1.4 1.5 1.4 4.7\n [52] 4.5 4.9 4.0 4.6 4.5 4.7 3.3 4.6 3.9 3.5 4.2 4.0 4.7 3.6 4.4 4.5 4.1\n [69] 4.5 3.9 4.8 4.0 4.9 4.7 4.3 4.4 4.8 5.0 4.5 3.5 3.8 3.7 3.9 5.1 4.5\n [86] 4.5 4.7 4.4 4.1 4.0 4.4 4.6 4.0 3.3 4.2 4.2 4.2 4.3 3.0 4.1 6.0 5.1\n[103] 5.9 5.6 5.8 6.6 4.5 6.3 5.8 6.1 5.1 5.3 5.5 5.0 5.1 5.3 5.5 6.7 6.9\n[120] 5.0 5.7 4.9 6.7 4.9 5.7 6.0 4.8 4.9 5.6 5.8 6.1 6.4 5.6 5.1 5.6 6.1\n[137] 5.6 5.5 4.8 5.4 5.6 5.1 5.1 5.9 5.7 5.2 5.0 5.2 5.4 5.1\n  [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4\n [18] 5.1 5.7 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5\n [35] 4.9 5.0 5.5 4.9 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.
 8 5.1 4.6 5.3 5.0 7.0\n [52] 6.4 6.9 5.5 6.5 5.7 6.3 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8\n [69] 6.2 5.6 5.9 6.1 6.3 6.1 6.4 6.6 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4\n [86] 6.0 6.7 6.3 5.6 5.5 5.5 6.1 5.8 5.0 5.6 5.7 5.7 6.2 5.1 5.7 6.3 5.8\n[103] 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2 6.5 6.4 6.8 5.7 5.8 6.4 6.5 7.7 7.7\n[120] 6.0 6.9 5.6 7.7 6.3 6.7 7.2 6.2 6.1 6.4 7.2 7.4 7.9 6.4 6.3 6.1 7.7\n[137] 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8 6.7 6.7 6.3 6.5 6.2 5.9"
+      },
+      "dateCreated": "Feb 10, 2016 10:01:17 PM",
+      "dateStarted": "Feb 23, 2016 2:45:14 PM",
+      "dateFinished": "Feb 23, 2016 2:45:14 PM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "title": "HTML Display",
+      "text": "%r \n\nprint(\"%html \u003ch3\u003eHello HTML\u003c/h3\u003e\")\nprint(\"\u003cfont color\u003d\u0027blue\u0027\u003e\u003cspan class\u003d\u0027fa fa-bars\u0027\u003e Easy...\u003c/font\u003e\u003c/span\u003e\")\nfor (i in 1:10) {\n  print(paste0(\"\u003ch4\u003e\", i, \" * 2 \u003d \", i*2, \"\u003c/h4\u003e\"))\n}",
+      "dateUpdated": "Feb 23, 2016 2:45:15 PM",
+      "config": {
+        "colWidth": 3.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {}
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/scala",
+        "title": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "jobName": "paragraph_1456140102445_51059930",
+      "id": "20160222-122142_1323614681",
+      "result": {
+        "code": "SUCCESS",
+        "type": "HTML",
+        "msg": "\u003cp\u003e\u003c/p\u003e\u003ch3\u003eHello HTML\u003c/h3\u003e\u003cfont color\u003d\"blue\"\u003e\u003cspan class\u003d\"fa fa-bars\"\u003e Easy…\u003c/span\u003e\u003c/font\u003e\u003ch4\u003e1 * 2 \u003d 2\u003c/h4\u003e\u003ch4\u003e2 * 2 \u003d 4\u003c/h4\u003e\u003ch4\u003e3 * 2 \u003d 6\u003c/h4\u003e\u003ch4\u003e4 * 2 \u003d 8\u003c/h4\u003e\u003ch4\u003e5 * 2 \u003d 10\u003c/h4\u003e\u003ch4\u003e6 * 2 \u003d 12\u003c/h4\u003e\u003ch4\u003e7 * 2 \u003d 14\u003c/h4\u003e\u003ch4\u003e8 * 2 \u003d 16\u003c/h4\u003e\u003ch4\u003e9 * 2 \u003d 18\u003c/h4\u003e\u003ch4\u003e10 * 2 \u003d 20\u003c/h4\u003e\u003cp\u003e\u003c/p\u003e"
+      },
+      "dateCreated": "Feb 22, 2016 12:21:42 PM",
+      "dateStarted": "Feb 23, 2016 2:45:15 PM",
+      "dateFinished": "Feb 23, 2016 2:45:16 PM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "title": "TABLE Display",
+      "text": "%r print(\"%table name\\tsize\\nsmall\\t100\\nlarge\\t1000\")",
+      "dateUpdated": "Feb 23, 2016 2:45:18 PM",
+      "config": {
+        "colWidth": 3.0,
+        "graph": {
+          "mode": "multiBarChart",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [
+            {
+              "name": "name",
+              "index": 0.0,
+              "aggr": "sum"
+            }
+          ],
+          "values": [
+            {
+              "name": "size",
+              "index": 1.0,
+              "aggr": "sum"
+            }
+          ],
+          "groups": [],
+          "scatter": {
+            "xAxis": {
+              "name": "name",
+              "index": 0.0,
+              "aggr": "sum"
+            },
+            "yAxis": {
+              "name": "size",
+              "index": 1.0,
+              "aggr": "sum"
+            }
+          }
+        },
+        "enabled": true,
+        "title": true,
+        "editorMode": "ace/mode/scala"
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "jobName": "paragraph_1456216582752_6855525",
+      "id": "20160223-093622_330111284",
+      "result": {
+        "code": "SUCCESS",
+        "type": "TABLE",
+        "msg": "name\tsize\nsmall\t100\nlarge\t1000"
+      },
+      "dateCreated": "Feb 23, 2016 9:36:22 AM",
+      "dateStarted": "Feb 23, 2016 2:45:18 PM",
+      "dateFinished": "Feb 23, 2016 2:45:18 PM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "title": "IMG Display",
+      "text": "%r print(paste0(\"%img \", \"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\u003d\"))",
+      "dateUpdated": "Feb 23, 2016 2:47:07 PM",
+      "config": {
+        "colWidth": 3.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {}
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/scala",
+        "title": true,
+        "editorHide": false
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "jobName": "paragraph_1456216588116_1304228816",
+      "id": "20160223-093628_594223067",
+      "result": {
+        "code": "SUCCESS",
+        "type": "IMG",
+        "msg": "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\u003d"
+      },
+      "dateCreated": "Feb 23, 2016 9:36:28 AM",
+      "dateStarted": "Feb 23, 2016 2:47:07 PM",
+      "dateFinished": "Feb 23, 2016 2:47:07 PM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "text": "z.input(\"name\", \"sun\")\n\n\n\n\n\n",
+      "dateUpdated": "Feb 23, 2016 3:06:16 PM",
+      "config": {
+        "colWidth": 3.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {}
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/scala"
+      },
+      "settings": {
+        "params": {
+          "name": "sun"
+        },
+        "forms": {
+          "name": {
+            "name": "name",
+            "displayName": "name",
+            "defaultValue": "sun",
+            "hidden": false
+          }
+        }
+      },
+      "jobName": "paragraph_1456235221022_-1625740722",
+      "id": "20160223-144701_1698149301",
+      "result": {
+        "code": "SUCCESS",
+        "type": "TEXT",
+        "msg": "res13: Object \u003d sun\n"
+      },
+      "dateCreated": "Feb 23, 2016 2:47:01 PM",
+      "dateStarted": "Feb 23, 2016 3:06:16 PM",
+      "dateFinished": "Feb 23, 2016 3:06:16 PM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "title": "[WIP] Dynamic Form",
+      "text": "%r \nprint(paste0(\"%html Hello \", z.input(\"name\", \"sun\")))\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",
+      "dateUpdated": "Feb 23, 2016 3:06:30 PM",
+      "config": {
+        "colWidth": 3.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {}
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/scala",
+        "title": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "jobName": "paragraph_1456217039220_218125354",
+      "id": "20160223-094359_718035548",
+      "result": {
+        "code": "SUCCESS",
+        "type": "HTML",
+        "msg": "\u003cp\u003eHello sun\u003c/p\u003e"
+      },
+      "dateCreated": "Feb 23, 2016 9:43:59 AM",
+      "dateStarted": "Feb 23, 2016 3:01:38 PM",
+      "dateFinished": "Feb 23, 2016 3:01:38 PM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "title": "Write Scala To R",
+      "text": "val s \u003d \"Hello R from Scala\"\nz.put(\"s\", s)\nval b \u003d new Integer(42)\nz.put(\"b\", b)\nval a: Array[Double] \u003d Array[Double](30.1, 20.0)\nz.put(\"a\", a)\nval m \u003d Array(Array(1, 4), Array(8, 16))\nz.put(\"m\", m)\nval v \u003d Vector(1, 2, 3, 4)\nz.put(\"v\", v)",
+      "authenticationInfo": {},
+      "dateUpdated": "Mar 30, 2016 9:05:07 AM",
+      "config": {
+        "colWidth": 3.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {}
+        },
+        "editorMode": "ace/mode/scala",
+        "enabled": true,
+        "title": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "jobName": "paragraph_1429862281402_-79250404",
+      "id": "20150424-095801_125725189",
+      "result": {
+        "code": "SUCCESS",
+        "type": "TEXT",
+        "msg": "s: String \u003d Hello R from Scala\nb: Integer \u003d 42\na: Array[Double] \u003d Array(30.1, 20.0)\nm: Array[Array[Int]] \u003d Array(Array(1, 4), Array(8, 16))\nv: scala.collection.immutable.Vector[Int] \u003d Vector(1, 2, 3, 4)\n"
+      },
+      "dateCreated": "Apr 24, 2015 9:58:01 AM",
+      "dateStarted": "Mar 30, 2016 9:05:07 AM",
+      "dateFinished": "Mar 30, 2016 9:05:07 AM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "title": "Read from R the Scala Variables",
+      "text": "%r\nz.get(\"s\")\nz.get(\"b\")\nprint(unlist(z.get(\"a\")))\nprint(unlist(z.get(\"m\")))\nz.get(\"v\")",
+      "authenticationInfo": {},
+      "dateUpdated": "Mar 30, 2016 9:05:08 AM",
+      "config": {
+        "colWidth": 3.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {}
+        },
+        "editorMode": "ace/mode/scala",
+        "enabled": true,
+        "title": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "jobName": "paragraph_1438930802740_-1781296534",
+      "id": "20150807-090002_1514685133",
+      "result": {
+        "code": "SUCCESS",
+        "type": "TEXT",
+        "msg": "[1] “Hello R from Scala”\n[1] 42\n[1] 30.1 20.0\n[1]  1  4  8 16\nJava ref type scala.collection.immutable.Vector id 92"
+      },
+      "dateCreated": "Aug 7, 2015 9:00:02 AM",
+      "dateStarted": "Mar 30, 2016 9:05:08 AM",
+      "dateFinished": "Mar 30, 2016 9:05:08 AM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "title": "Write R to Scala",
+      "text": "%r\ns \u003c- \"Hello Scala from R\"\nprint(s)\nz.put(\"rs\", s)\nb \u003c- TRUE\nprint(b)\nz.put(\"rb\", b)\nd \u003c- 15.0\nprint(d)\nz.put(\"rd\", d)\nm \u003c- c(2.4, 2.5, 4)\nprint(m)\nz.put(\"rm\", m)",
+      "authenticationInfo": {},
+      "dateUpdated": "Mar 30, 2016 9:05:25 AM",
+      "config": {
+        "colWidth": 3.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {}
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/scala",
+        "title": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "jobName": "paragraph_1455137934157_-1786381957",
+      "id": "20160210-215854_620520530",
+      "result": {
+        "code": "SUCCESS",
+        "type": "TEXT",
+        "msg": "[1] “Hello Scala from R”\nNULL\n[1] TRUE\nNULL\n[1] 15\nNULL\n[1] 2.4 2.5 4.0\nNULL"
+      },
+      "dateCreated": "Feb 10, 2016 9:58:54 PM",
+      "dateStarted": "Mar 30, 2016 9:05:25 AM",
+      "dateFinished": "Mar 30, 2016 9:05:25 AM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "title": "Read from Scala the R Variables",
+      "text": "println(\"rs \u003d \"+ z.get(\"rs\"))\nprintln(\"rb \u003d \"+ z.get(\"rb\"))\nprintln(\"rd \u003d \"+ z.get(\"rd\"))\nprintln(\"rm \u003d \"+ z.get(\"rm\"))\n// println(z.get(\"rm\").getClass)\n// println(\"rm \u003d \"+ z.get(\"rm\").asInstanceOf[Array[Double]].toSeq)",
+      "authenticationInfo": {},
+      "dateUpdated": "Mar 30, 2016 9:05:27 AM",
+      "config": {
+        "colWidth": 3.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {}
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/scala",
+        "title": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "jobName": "paragraph_1455138066039_1048230112",
+      "id": "20160210-220106_141884849",
+      "result": {
+        "code": "SUCCESS",
+        "type": "TEXT",
+        "msg": "rs \u003d Hello Scala from R\nrb \u003d true\nrd \u003d 15.0\nrm \u003d 2.4\n"
+      },
+      "dateCreated": "Feb 10, 2016 10:01:06 PM",
+      "dateStarted": "Mar 30, 2016 9:05:27 AM",
+      "dateFinished": "Mar 30, 2016 9:05:27 AM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "title": "Create a Spark Dataframe",
+      "text": "import org.apache.commons.io.IOUtils\nimport java.net.URL\nimport java.nio.charset.Charset\n\nval bankText \u003d sc.parallelize(\n    IOUtils.toString(\n        new URL(\"https://s3.amazonaws.com/apache-zeppelin/tutorial/bank/bank.csv\"),\n        Charset.forName(\"utf8\")).split(\"\\n\"))\n\ncase class Bank(age: Integer, job: String, marital: String, education: String, balance: Integer)\n\nval bank \u003d bankText.map(s \u003d\u003e s.split(\";\")).filter(s \u003d\u003e s(0) !\u003d \"\\\"age\\\"\").map(\n    s \u003d\u003e Bank(s(0).toInt, \n            s(1).replaceAll(\"\\\"\", \"\"),\n            s(2).replaceAll(\"\\\"\", \"\"),\n            s(3).replaceAll(\"\\\"\", \"\"),\n            s(5).replaceAll(\"\\\"\", \"\").toInt\n        )\n).toDF()\nbank.registerTempTable(\"bank\")",
+      "dateUpdated": "Feb 23, 2016 2:49:36 PM",
+      "config": {
+        "colWidth": 6.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {}
+        },
+        "enabled": true,
+        "lineNumbers": false,
+        "title": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "jobName": "paragraph_1455142039343_-233762796",
+      "id": "20160210-230719_2111095838",
+      "result": {
+        "code": "SUCCESS",
+        "type": "TEXT",
+        "msg": "import org.apache.commons.io.IOUtils\nimport java.net.URL\nimport java.nio.charset.Charset\nbankText: org.apache.spark.rdd.RDD[String] \u003d ParallelCollectionRDD[0] at parallelize at \u003cconsole\u003e:27\ndefined class Bank\nbank: org.apache.spark.sql.DataFrame \u003d [age: int, job: string, marital: string, education: string, balance: int]\n"
+      },
+      "dateCreated": "Feb 10, 2016 11:07:19 PM",
+      "dateStarted": "Feb 23, 2016 2:49:36 PM",
+      "dateFinished": "Feb 23, 2016 2:49:41 PM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "title": "Read the Spark Dataframe from R",
+      "text": "%r\n\ndf \u003c- sql(sqlContext, \"select count(*) from bank\")\nprintSchema(df)\nSparkR::head(df)",
+      "dateUpdated": "Feb 23, 2016 2:49:52 PM",
+      "config": {
+        "colWidth": 6.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {}
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/scala",
+        "tableHide": false,
+        "title": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "jobName": "paragraph_1455142043062_1598026718",
+      "id": "20160210-230723_1811469598",
+      "result": {
+        "code": "SUCCESS",
+        "type": "TEXT",
+        "msg": "root\n |– _c0: long (nullable \u003d false)\n   _c0\n1 4521"
+      },
+      "dateCreated": "Feb 10, 2016 11:07:23 PM",
+      "dateStarted": "Feb 23, 2016 2:49:52 PM",
+      "dateFinished": "Feb 23, 2016 2:49:54 PM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "title": "Query with Spark Dataframe with SQL",
+      "text": "%sql select count(*) from bank",
+      "dateUpdated": "Feb 23, 2016 2:49:56 PM",
+      "config": {
+        "colWidth": 6.0,
+        "graph": {
+          "mode": "table",
+          "height": 99.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {}
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/scala",
+        "title": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "jobName": "paragraph_1455142050697_-1353382095",
+      "id": "20160210-230730_1259663883",
+      "result": {
+        "code": "SUCCESS",
+        "type": "TABLE",
+        "msg": "_c0\n4521\n"
+      },
+      "dateCreated": "Feb 10, 2016 11:07:30 PM",
+      "dateStarted": "Feb 23, 2016 2:49:56 PM",
+      "dateFinished": "Feb 23, 2016 2:49:56 PM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "title": "Create a R Dataframe",
+      "text": "%r \n\nlocalNames \u003c- data.frame(name\u003dc(\"John\", \"Smith\", \"Sarah\"), budget\u003dc(19, 53, 18))\nnames \u003c- createDataFrame(sqlContext, localNames)\nprintSchema(names)\nregisterTempTable(names, \"names\")\n\n# SparkR::head(names)",
+      "dateUpdated": "Feb 23, 2016 2:50:02 PM",
+      "config": {
+        "colWidth": 6.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {}
+        },
+        "enabled": true,
+        "title": true,
+        "editorMode": "ace/mode/scala"
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "jobName": "paragraph_1455142112413_519883679",
+      "id": "20160210-230832_1847721959",
+      "result": {
+        "code": "SUCCESS",
+        "type": "TEXT",
+        "msg": "root\n |– name: string (nullable \u003d true)\n |– budget: double (nullable \u003d true)"
+      },
+      "dateCreated": "Feb 10, 2016 11:08:32 PM",
+      "dateStarted": "Feb 23, 2016 2:50:02 PM",
+      "dateFinished": "Feb 23, 2016 2:50:02 PM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "title": "Read the R Dataframe from Spark",
+      "text": "sqlc.sql(\"select * from names\").head",
+      "dateUpdated": "Feb 23, 2016 2:50:09 PM",
+      "config": {
+        "colWidth": 6.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {}
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/scala",
+        "title": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "jobName": "paragraph_1455188357108_95477841",
+      "id": "20160211-115917_445850505",
+      "result": {
+        "code": "SUCCESS",
+        "type": "TEXT",
+        "msg": "res32: org.apache.spark.sql.Row \u003d [John,19.0]\n"
+      },
+      "dateCreated": "Feb 11, 2016 11:59:17 AM",
+      "dateStarted": "Feb 23, 2016 2:50:09 PM",
+      "dateFinished": "Feb 23, 2016 2:50:10 PM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "title": "Query the R Datafame with SQL",
+      "text": "%sql select * from names\n",
+      "dateUpdated": "Feb 23, 2016 2:50:15 PM",
+      "config": {
+        "colWidth": 6.0,
+        "graph": {
+          "mode": "pieChart",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [
+            {
+              "name": "name",
+              "index": 0.0,
+              "aggr": "sum"
+            }
+          ],
+          "values": [],
+          "groups": [],
+          "scatter": {
+            "xAxis": {
+              "name": "name",
+              "index": 0.0,
+              "aggr": "sum"
+            }
+          }
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/sql",
+        "title": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "jobName": "paragraph_1455142115582_-1840950897",
+      "id": "20160210-230835_19876971",
+      "result": {
+        "code": "SUCCESS",
+        "type": "TABLE",
+        "msg": "name\tbudget\nJohn\t19.0\nSmith\t53.0\nSarah\t18.0\n"
+      },
+      "dateCreated": "Feb 10, 2016 11:08:35 PM",
+      "dateStarted": "Feb 23, 2016 2:50:15 PM",
+      "dateFinished": "Feb 23, 2016 2:50:15 PM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "text": "%r pairs(iris)",
+      "dateUpdated": "Feb 23, 2016 2:50:20 PM",
+      "config": {
+        "colWidth": 4.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {}
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/scala"
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "jobName": "paragraph_1455137735427_-1023869289",
+      "id": "20160210-215535_1815168219",
+      "result": {
+        "code": "SUCCESS",
+        "type": "HTML",
+        "msg": "\u003cp\u003e\u003cimg src\u003d\"data:image/png;base64,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\u003d\" alt\u003d\"plot of chunk unnamed-chunk-1\" width\u003d\"100%\" /\u003e \u003c/p\u003e"
+      },
+      "dateCreated": "Feb 10, 2016 9:55:35 PM",
+      "dateStarted": "Feb 23, 2016 2:50:20 PM",
+      "dateFinished": "Feb 23, 2016 2:50:20 PM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "text": "%r {\"imageWidth\": \"400px\"} plot(iris, col \u003d heat.colors(3))",
+      "dateUpdated": "Feb 23, 2016 2:50:22 PM",
+      "config": {
+        "colWidth": 4.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {}
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/scala"
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "jobName": "paragraph_1455137737773_-549089146",
+      "id": "20160210-215537_582262164",
+      "result": {
+        "code": "SUCCESS",
+        "type": "HTML",
+        "msg": "\u003cp\u003e\u003cimg src\u003d\"data:image/png;base64,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

<TRUNCATED>


[3/3] incubator-zeppelin git commit: R and SparkR Support [WIP]

Posted by mo...@apache.org.
R and SparkR Support [WIP]

### What is this PR for?

Implement R and SpakR Intepreter as part of the Spark Interpreter Group. It also implements R and Scala binding (in both directions).

### What type of PR is it?

[Feature]

### Todos

* [ ] - Documentation
* [ ] - Unit test (if relevant, as we depend on R being available on the host)
* [ ] - Assess licensing (a priori ok as we don't delive anything out of ASL2, but we should corectly phrase the NOTICE as we depend on non-ASL2 comptabile licenses (R) to run the interpreter).

### Is there a relevant Jira issue?

https://issues.apache.org/jira/browse/ZEPPELIN-156 SparkR support

### How should this be tested?

You need R available on the host running the notebook.

    For Centos: yum install R R-devel
    For Ubuntu: apt-get install r-base r-cran-rserve

Install additional R packages:

```
curl https://cran.r-project.org/src/contrib/Archive/rscala/rscala_1.0.6.tar.gz -o /tmp/rscala_1.0.6.tar.gz
R CMD INSTALL /tmp/rscala_1.0.6.tar.gz
R -e "install.packages('ggplot2', repos = 'http://cran.us.r-project.org')"
R -e install.packages('knitr', repos = 'http://cran.us.r-project.org')
```

- Build + launch Zeppelin and test the R note.

!!! you need rscala_1.0.6 (if not, you need to build with -Drscala.version=...)

### Screenshots (if appropriate)

#### Simple R

[![Simple R](https://raw.githubusercontent.com/datalayer/zeppelin-R/rscala/_Rimg/simple-r.png)](https://raw.githubusercontent.com/datalayer/zeppelin-R/rscala/_Rimg/simple-r.png)

#### Plot

[![Plot](https://raw.githubusercontent.com/datalayer/zeppelin-R/rscala/_Rimg/plot.png)](https://raw.githubusercontent.com/datalayer/zeppelin-R/rscala/_Rimg/plot.png)

#### Scala R Binding

[![Scala R Binding](https://raw.githubusercontent.com/datalayer/zeppelin-R/rscala/_Rimg/scala-r.png)](https://raw.githubusercontent.com/datalayer/zeppelin-R/rscala/_Rimg/scala-r.png)

#### R Scala Binding

[![R Scala Binding](https://raw.githubusercontent.com/datalayer/zeppelin-R/rscala/_Rimg/r-scala.png)](https://raw.githubusercontent.com/datalayer/zeppelin-R/rscala/_Rimg/r-scala.png)

#### SparkR

[![SparkR](https://raw.githubusercontent.com/datalayer/zeppelin-R/rscala/_Rimg/sparkr.png)](https://raw.githubusercontent.com/datalayer/zeppelin-R/rscala/_Rimg/sparkr.png)

### Questions:

* Does the licenses files need update? to be checked... (cfr R needs to be available to make this interpreter operational).
* Is there breaking changes for older versions? No
* Does this needs documentation? Yes

Author: Eric Charles <er...@datalayer.io>
Author: Lee moon soo <mo...@apache.org>

This patch had conflicts when merged, resolved by
Committer: Lee moon soo <mo...@apache.org>

Closes #702 from echarles/rscala-z and squashes the following commits:

137040c [Eric Charles] Trigger build again
53645f6 [Eric Charles] Trigger build
519f3a9 [Eric Charles] Add back the spark.bin.download.url property for sparkr profile
d1f0521 [Eric Charles] Merge with master
72ab72c [Eric Charles] Trigger travis build
151af0a [Eric Charles] Enable back the R install in travis
ed70820 [Eric Charles] Merge with master
ae21036 [Eric Charles] Note: unlist array passed from scala to R, patch contributed by @jeffsteinmetz
ac0e16d [Eric Charles] Merge pull request #8 from Leemoonsoo/rscala-z-fix-interpreter-list-order
90c1b4d [Lee moon soo] Sort interpreter list correctly
c36fe8a [Eric Charles] Return SUCCESS if result is empty
463c066 [Eric Charles] Log exception on open
f6e685a [Eric Charles] Remove SparkRInterpeterTest, test is convered in ZeppelinSparkClusterTest
19ec4f3 [Eric Charles] Add back SparkRInterpreterTest.java
58227e9 [Eric Charles] Merge branch 'rscala-z-rs' into rscala-z
290289f [Eric Charles] Merge with master
eb6c40c [Eric Charles] Merge remote rscala-z-rs
962d0d9 [Eric Charles] DOC: Add more visualization libraries
9b95d60 [Lee moon soo] Remove unnecessary test
894c399 [Lee moon soo] Remove SparkRInterpreterTest
bac1e1b [Lee moon soo] R on travis
f6661c2 [Lee moon soo] fix profile activation
1a0195f [Lee moon soo] exclude test when sparkr profile is not defined
2307115 [Lee moon soo] Make sparkr work without SPARK_HOME
dcfee32 [Lee moon soo] Add test
aa35a83 [Lee moon soo] Download sparkR package
1d99fa8 [Lee moon soo] Remove rscala related stuff from project
fc66da9 [Lee moon soo] R -> r
a122894 [Lee moon soo] render output
9df9535 [Lee moon soo] Remove rscala dependency
1e2c99b [Eric Charles] DOC: no need for r-cran-rserve, thx to @jeffsteinmetz
2300ebc [Eric Charles] Update to latest change in interpeter constructs
ecf8bc4 [Eric Charles] Merge with master
a119b72 [Eric Charles] Merge with remote
454c1cb [Eric Charles] Rebase on master and update test to deal with interpretercontext constructor change
b30f6f4 [Eric Charles] Support HTML, TABLE and IMG display - Dynamic form in progress
89d6a3a [Eric Charles] DOC: Fix typo (contributed by @AhyoungRyu) + fix missing depencies (contributed by @btiernay on https://github.com/datalayer/datalayer-zeppelin/issues/6)
a6a3695 [Eric Charles] fix SparkInterpreterTest to deal with previous commit chanching the returned html
35486c7 [Eric Charles] Always return html preview in case of pure text
a0306fc [Eric Charles] Fix the expected html value for test
47eec88 [Eric Charles] Fix code format to make checkstyle happy
f963e1c [Eric Charles] polish examples with title
6cf8615 [Eric Charles] Make it work also on chromium
7b04b6b [Eric Charles] Support ggplot2 output size https://github.com/datalayer/zeppelin-R/issues/2
17d6b0d [Eric Charles] Less test in the SparkRInterpreterTest
f4aac04 [Eric Charles] Add interactive visualization example
816f4d9 [Eric Charles] Run only one test method and see Travis reaction
702556f [Eric Charles] RAT: Disabel RAT check on downloaded rscala folder
d5538a2 [Eric Charles] update pom to download rscala on build
40efe33 [Eric Charles] Add test for SparkRInterpreter
09bb458 [Eric Charles] Use java factory to allow mockito usage
5385adb [Eric Charles] Add jar in R folder
c0063fc [Eric Charles] Ignore downloaded rscala
4d5cfa5 [Eric Charles] Initial documentation for R Interpreter
3e24d02 [Eric Charles] Add license for rscala
c88a914 [Eric Charles] Remove rscala jar
554bcb6 [Eric Charles] Add README.md placeholder for rscala lib folder
40b4ec6 [Eric Charles] Remove png files and restore README.md
220fe51 [Eric Charles] Make rscala configurable in the spark-dependencies module
15375eb [Eric Charles] Add SparRInterpreter implementation
4161619 [Eric Charles] Support HTML, TABLE and IMG display - Dynamic form in progress
8e635e1 [Eric Charles] DOC: Fix typo (contributed by @AhyoungRyu) + fix missing depencies (contributed by @btiernay on https://github.com/datalayer/datalayer-zeppelin/issues/6)
9a988f9 [Eric Charles] fix SparkInterpreterTest to deal with previous commit chanching the returned html
28fc9b2 [Eric Charles] Always return html preview in case of pure text
e8ed8dd [Eric Charles] Fix the expected html value for test
facc682 [Eric Charles] Fix code format to make checkstyle happy
9b168ff [Eric Charles] polish examples with title
8b059c4 [Eric Charles] Make it work also on chromium
66c3545 [Eric Charles] Support ggplot2 output size https://github.com/datalayer/zeppelin-R/issues/2
3ae0bc1 [Eric Charles] Less test in the SparkRInterpreterTest
b9b2787 [Eric Charles] Add interactive visualization example
9218d65 [Eric Charles] Run only one test method and see Travis reaction
ee6e43b [Eric Charles] RAT: Disabel RAT check on downloaded rscala folder
8d664f6 [Eric Charles] update pom to download rscala on build
21668b3 [Eric Charles] Add test for SparkRInterpreter
068ac24 [Eric Charles] Use java factory to allow mockito usage
caf157b [Eric Charles] Add jar in R folder
1eddadb [Eric Charles] Ignore downloaded rscala
0af2bec [Eric Charles] Initial documentation for R Interpreter
8e3c997 [Eric Charles] Add license for rscala
7a95ef4 [Eric Charles] Remove rscala jar
b8ae4eb [Eric Charles] Add README.md placeholder for rscala lib folder
aa6a7a1 [Eric Charles] Remove png files and restore README.md
9312a0c [Eric Charles] Make rscala configurable in the spark-dependencies module
363b244 [Eric Charles] Add SparRInterpreter implementation


Project: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/commit/7d6cc7e9
Tree: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/tree/7d6cc7e9
Diff: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/diff/7d6cc7e9

Branch: refs/heads/master
Commit: 7d6cc7e99154e2d337c11fdf8be1a874ed3e9ada
Parents: d5e87fb
Author: Eric Charles <er...@datalayer.io>
Authored: Mon Apr 4 05:00:09 2016 +0200
Committer: Lee moon soo <mo...@apache.org>
Committed: Tue Apr 5 17:03:15 2016 +0900

----------------------------------------------------------------------
 .travis.yml                                     |   27 +-
 conf/zeppelin-site.xml.template                 |    2 +-
 docs/_includes/themes/zeppelin/_navigation.html |    1 +
 docs/interpreter/R.md                           |   41 +
 docs/interpreter/r.md                           |   40 +-
 docs/rest-api/rest-configuration.md             |    2 +-
 notebook/r/note.json                            | 1036 ++++++++++++++++++
 pom.xml                                         |    2 +-
 spark-dependencies/pom.xml                      |   66 +-
 spark/pom.xml                                   |   83 +-
 .../zeppelin/spark/SparkRInterpreter.java       |  226 ++++
 .../org/apache/zeppelin/spark/ZeppelinR.java    |  404 +++++++
 .../apache/zeppelin/spark/ZeppelinRContext.java |   55 +
 spark/src/main/resources/R/zeppelin_sparkr.R    |   99 ++
 .../scala/org/apache/spark/SparkRBackend.scala  |   54 +
 .../zeppelin/spark/ZeppelinRDisplay.scala       |  119 ++
 .../zeppelin/rest/AbstractTestRestApi.java      |    8 +-
 .../zeppelin/rest/ZeppelinSparkClusterTest.java |   26 +-
 zeppelin-zengine/pom.xml                        |    4 +-
 .../zeppelin/conf/ZeppelinConfiguration.java    |    1 +
 .../interpreter/InterpreterFactory.java         |    8 +-
 21 files changed, 2274 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/7d6cc7e9/.travis.yml
----------------------------------------------------------------------
diff --git a/.travis.yml b/.travis.yml
index ba66bae..f608704 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -20,20 +20,29 @@ sudo: false
 cache:
   directories:
     - .spark-dist
-  
+
+addons:
+  apt:
+    sources:
+    - r-packages-precise
+    packages:
+    - r-base-dev
+    - r-cran-evaluate
+    - r-cran-base64enc
+
 matrix:
   include:
     # Test all modules
     - jdk: "oraclejdk7"
-      env: SPARK_VER="1.6.1" HADOOP_VER="2.3" PROFILE="-Pspark-1.6 -Pr -Phadoop-2.3 -Ppyspark -Pscalding" BUILD_FLAG="package -Pbuild-distr" TEST_FLAG="verify -Pusing-packaged-distr" TEST_PROJECTS=""
+      env: SPARK_VER="1.6.1" HADOOP_VER="2.3" PROFILE="-Pspark-1.6 -Pr -Phadoop-2.3 -Ppyspark -Psparkr -Pscalding" BUILD_FLAG="package -Pbuild-distr" TEST_FLAG="verify -Pusing-packaged-distr" TEST_PROJECTS=""
 
     # Test spark module for 1.5.2
     - jdk: "oraclejdk7"
-      env: SPARK_VER="1.5.2" HADOOP_VER="2.3" PROFILE="-Pspark-1.5 -Pr -Phadoop-2.3 -Ppyspark" BUILD_FLAG="package -DskipTests" TEST_FLAG="verify" TEST_PROJECTS="-pl zeppelin-interpreter,zeppelin-zengine,zeppelin-server,zeppelin-display,spark-dependencies,spark,r -Dtest=org.apache.zeppelin.rest.*Test,org.apache.zeppelin.spark* -DfailIfNoTests=false"
+      env: SPARK_VER="1.5.2" HADOOP_VER="2.3" PROFILE="-Pspark-1.5 -Pr -Phadoop-2.3 -Ppyspark -Psparkr" BUILD_FLAG="package -DskipTests" TEST_FLAG="verify" TEST_PROJECTS="-pl zeppelin-interpreter,zeppelin-zengine,zeppelin-server,zeppelin-display,spark-dependencies,spark,r -Dtest=org.apache.zeppelin.rest.*Test,org.apache.zeppelin.spark* -DfailIfNoTests=false"
 
     # Test spark module for 1.4.1
     - jdk: "oraclejdk7"
-      env: SPARK_VER="1.4.1" HADOOP_VER="2.3" PROFILE="-Pspark-1.4 -Pr -Phadoop-2.3 -Ppyspark" BUILD_FLAG="package -DskipTests" TEST_FLAG="verify" TEST_PROJECTS="-pl zeppelin-interpreter,zeppelin-zengine,zeppelin-server,zeppelin-display,spark-dependencies,spark,r -Dtest=org.apache.zeppelin.rest.*Test,org.apache.zeppelin.spark* -DfailIfNoTests=false"
+      env: SPARK_VER="1.4.1" HADOOP_VER="2.3" PROFILE="-Pspark-1.4 -Pr -Phadoop-2.3 -Ppyspark -Psparkr" BUILD_FLAG="package -DskipTests" TEST_FLAG="verify" TEST_PROJECTS="-pl zeppelin-interpreter,zeppelin-zengine,zeppelin-server,zeppelin-display,spark-dependencies,spark,r -Dtest=org.apache.zeppelin.rest.*Test,org.apache.zeppelin.spark* -DfailIfNoTests=false"
 
     # Test spark module for 1.3.1
     - jdk: "oraclejdk7"
@@ -51,18 +60,10 @@ matrix:
     - jdk: "oraclejdk7"
       env: TEST_SELENIUM="true" SPARK_VER="1.6.1" HADOOP_VER="2.3" PROFILE="-Pspark-1.6 -Phadoop-2.3 -Ppyspark" BUILD_FLAG="package -DskipTests" TEST_FLAG="verify" TEST_PROJECTS="-pl zeppelin-interpreter,zeppelin-zengine,zeppelin-server,zeppelin-display,spark-dependencies,spark -Dtest=org.apache.zeppelin.AbstractFunctionalSuite -DfailIfNoTests=false"
 
-addons:
-  apt:
-    sources:
-    - r-packages-precise
-    packages:
-    - r-base-dev
-    - r-cran-evaluate
-    - r-cran-base64enc
-
 before_install:
   - "ls -la .spark-dist"
   - mkdir -p ~/R
+  - echo 'R_LIBS=~/R' > ~/.Renviron
   - R -e "install.packages('knitr', repos = 'http://cran.us.r-project.org', lib='~/R')"
   - export R_LIBS='~/R'
   - "export DISPLAY=:99.0"

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/7d6cc7e9/conf/zeppelin-site.xml.template
----------------------------------------------------------------------
diff --git a/conf/zeppelin-site.xml.template b/conf/zeppelin-site.xml.template
index f475f87..3fb55c2 100755
--- a/conf/zeppelin-site.xml.template
+++ b/conf/zeppelin-site.xml.template
@@ -144,7 +144,7 @@
 
 <property>
   <name>zeppelin.interpreters</name>
-  <value>org.apache.zeppelin.spark.SparkInterpreter,org.apache.zeppelin.spark.PySparkInterpreter,org.apache.zeppelin.spark.SparkSqlInterpreter,org.apache.zeppelin.spark.DepInterpreter,org.apache.zeppelin.markdown.Markdown,org.apache.zeppelin.angular.AngularInterpreter,org.apache.zeppelin.shell.ShellInterpreter,org.apache.zeppelin.hive.HiveInterpreter,org.apache.zeppelin.tajo.TajoInterpreter,org.apache.zeppelin.file.HDFSFileInterpreter,org.apache.zeppelin.flink.FlinkInterpreter,org.apache.zeppelin.lens.LensInterpreter,org.apache.zeppelin.ignite.IgniteInterpreter,org.apache.zeppelin.ignite.IgniteSqlInterpreter,org.apache.zeppelin.cassandra.CassandraInterpreter,org.apache.zeppelin.geode.GeodeOqlInterpreter,org.apache.zeppelin.postgresql.PostgreSqlInterpreter,org.apache.zeppelin.jdbc.JDBCInterpreter,org.apache.zeppelin.phoenix.PhoenixInterpreter,org.apache.zeppelin.kylin.KylinInterpreter,org.apache.zeppelin.elasticsearch.ElasticsearchInterpreter,org.apache.zeppelin.scalding.ScaldingInte
 rpreter,org.apache.zeppelin.alluxio.AlluxioInterpreter,org.apache.zeppelin.hbase.HbaseInterpreter,org.apache.zeppelin.rinterpreter.KnitR,org.apache.zeppelin.rinterpreter.RRepl</value>
+  <value>org.apache.zeppelin.spark.SparkInterpreter,org.apache.zeppelin.spark.PySparkInterpreter,org.apache.zeppelin.spark.SparkRInterpreter,org.apache.zeppelin.spark.SparkSqlInterpreter,org.apache.zeppelin.spark.DepInterpreter,org.apache.zeppelin.markdown.Markdown,org.apache.zeppelin.angular.AngularInterpreter,org.apache.zeppelin.shell.ShellInterpreter,org.apache.zeppelin.hive.HiveInterpreter,org.apache.zeppelin.tajo.TajoInterpreter,org.apache.zeppelin.file.HDFSFileInterpreter,org.apache.zeppelin.flink.FlinkInterpreter,org.apache.zeppelin.lens.LensInterpreter,org.apache.zeppelin.ignite.IgniteInterpreter,org.apache.zeppelin.ignite.IgniteSqlInterpreter,org.apache.zeppelin.cassandra.CassandraInterpreter,org.apache.zeppelin.geode.GeodeOqlInterpreter,org.apache.zeppelin.postgresql.PostgreSqlInterpreter,org.apache.zeppelin.jdbc.JDBCInterpreter,org.apache.zeppelin.phoenix.PhoenixInterpreter,org.apache.zeppelin.kylin.KylinInterpreter,org.apache.zeppelin.elasticsearch.ElasticsearchInterpret
 er,org.apache.zeppelin.scalding.ScaldingInterpreter,org.apache.zeppelin.alluxio.AlluxioInterpreter,org.apache.zeppelin.hbase.HbaseInterpreter,org.apache.zeppelin.rinterpreter.KnitR,org.apache.zeppelin.rinterpreter.RRepl</value>
   <description>Comma separated interpreter configurations. First interpreter become a default</description>
 </property>
 

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/7d6cc7e9/docs/_includes/themes/zeppelin/_navigation.html
----------------------------------------------------------------------
diff --git a/docs/_includes/themes/zeppelin/_navigation.html b/docs/_includes/themes/zeppelin/_navigation.html
index c60ba74..c616107 100644
--- a/docs/_includes/themes/zeppelin/_navigation.html
+++ b/docs/_includes/themes/zeppelin/_navigation.html
@@ -54,6 +54,7 @@
                 <li><a href="{{BASE_PATH}}/interpreter/lens.html">Lens</a></li>
                 <li><a href="{{BASE_PATH}}/interpreter/markdown.html">Markdown</a></li>
                 <li><a href="{{BASE_PATH}}/interpreter/postgresql.html">Postgresql, hawq</a></li>
+                <li><a href="{{BASE_PATH}}/interpreter/R.html">R</a></li>
                 <li><a href="{{BASE_PATH}}/interpreter/scalding.html">Scalding</a></li>
                 <li><a href="{{BASE_PATH}}/pleasecontribute.html">Shell</a></li>
                 <li><a href="{{BASE_PATH}}/interpreter/spark.html">Spark</a></li>

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/7d6cc7e9/docs/interpreter/R.md
----------------------------------------------------------------------
diff --git a/docs/interpreter/R.md b/docs/interpreter/R.md
new file mode 100644
index 0000000..fde9983
--- /dev/null
+++ b/docs/interpreter/R.md
@@ -0,0 +1,41 @@
+---
+layout: page
+title: "R Interpreter"
+description: ""
+group: manual
+---
+{% include JB/setup %}
+
+## R Interpreter for Apache Zeppelin
+
+[R](https://www.r-project.org) is a free software environment for statistical computing and graphics.
+
+To run R code and visualize plots in Apache Zeppelin, you will need R on your master node (or your dev laptop).
+
++ For Centos: `yum install R R-devel libcurl-devel openssl-devel`
++ For Ubuntu: `apt-get install r-base`
+    
+Validate your installation with a simple R command:
+
+```
+R -e "print(1+1)"
+```
+
+To enjoy plots, install additional libraries with:
+
+```
++ devtools with `R -e "install.packages('devtools', repos = 'http://cran.us.r-project.org')"`
++ knitr with `R -e "install.packages('knitr', repos = 'http://cran.us.r-project.org')"`
++ ggplot2 with `R -e "install.packages('ggplot2', repos = 'http://cran.us.r-project.org')"`
++ Other vizualisation librairies: `R -e "install.packages(c('devtools','mplot', 'googleVis'), repos = 'http://cran.us.r-project.org'); require(devtools); install_github('ramnathv/rCharts')"`
+```
+
+We recommend you to also install the following optional R libraries for happy data analytics:
+
++ glmnet
++ pROC
++ data.table
++ caret
++ sqldf
++ wordcloud
+

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/7d6cc7e9/docs/interpreter/r.md
----------------------------------------------------------------------
diff --git a/docs/interpreter/r.md b/docs/interpreter/r.md
index 9b893ad..3706271 100644
--- a/docs/interpreter/r.md
+++ b/docs/interpreter/r.md
@@ -97,4 +97,42 @@ And vice versa:
 
 * Error `unable to start device X11` with the repl interpreter.  Check your shell login scripts to see if they are adjusting the `DISPLAY` environment variable.  This is common on some operating systems as a workaround for ssh issues, but can interfere with R plotting. 
 
-* akka Library Version or `TTransport` errors.  This can happen if you try to run Zeppelin with a SPARK_HOME that has a version of Spark other than the one specified with `-Pspark-1.x` when Zeppelin was compiled.
\ No newline at end of file
+* akka Library Version or `TTransport` errors.  This can happen if you try to run Zeppelin with a SPARK_HOME that has a version of Spark other than the one specified with `-Pspark-1.x` when Zeppelin was compiled.
+
+
+
+
+
+## R Interpreter for Apache Zeppelin
+
+[R](https://www.r-project.org) is a free software environment for statistical computing and graphics.
+
+To run R code and visualize plots in Apache Zeppelin, you will need R on your master node (or your dev laptop).
+
++ For Centos: `yum install R R-devel libcurl-devel openssl-devel`
++ For Ubuntu: `apt-get install r-base`
+    
+Validate your installation with a simple R command:
+
+```
+R -e "print(1+1)"
+```
+
+To enjoy plots, install additional libraries with:
+
+```
++ devtools with `R -e "install.packages('devtools', repos = 'http://cran.us.r-project.org')"`
++ knitr with `R -e "install.packages('knitr', repos = 'http://cran.us.r-project.org')"`
++ ggplot2 with `R -e "install.packages('ggplot2', repos = 'http://cran.us.r-project.org')"`
++ Other vizualisation librairies: `R -e "install.packages(c('devtools','mplot', 'googleVis'), repos = 'http://cran.us.r-project.org'); require(devtools); install_github('ramnathv/rCharts')"`
+```
+
+We recommend you to also install the following optional R libraries for happy data analytics:
+
++ glmnet
++ pROC
++ data.table
++ caret
++ sqldf
++ wordcloud
+

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/7d6cc7e9/docs/rest-api/rest-configuration.md
----------------------------------------------------------------------
diff --git a/docs/rest-api/rest-configuration.md b/docs/rest-api/rest-configuration.md
index 587b065..b7d2c14 100644
--- a/docs/rest-api/rest-configuration.md
+++ b/docs/rest-api/rest-configuration.md
@@ -79,7 +79,7 @@ limitations under the License.
       "zeppelin.server.context.path":"/",
       "zeppelin.ssl.keystore.type":"JKS",
       "zeppelin.ssl.truststore.path":"truststore",
-      "zeppelin.interpreters":"org.apache.zeppelin.spark.SparkInterpreter,org.apache.zeppelin.spark.PySparkInterpreter,org.apache.zeppelin.spark.SparkSqlInterpreter,org.apache.zeppelin.spark.DepInterpreter,org.apache.zeppelin.markdown.Markdown,org.apache.zeppelin.angular.AngularInterpreter,org.apache.zeppelin.shell.ShellInterpreter,org.apache.zeppelin.hive.HiveInterpreter,org.apache.zeppelin.tajo.TajoInterpreter,org.apache.zeppelin.flink.FlinkInterpreter,org.apache.zeppelin.lens.LensInterpreter,org.apache.zeppelin.ignite.IgniteInterpreter,org.apache.zeppelin.ignite.IgniteSqlInterpreter,org.apache.zeppelin.cassandra.CassandraInterpreter,org.apache.zeppelin.geode.GeodeOqlInterpreter,org.apache.zeppelin.postgresql.PostgreSqlInterpreter,org.apache.zeppelin.phoenix.PhoenixInterpreter,org.apache.zeppelin.kylin.KylinInterpreter,org.apache.zeppelin.elasticsearch.ElasticsearchInterpreter,org.apache.zeppelin.scalding.ScaldingInterpreter",
+      "zeppelin.interpreters":"org.apache.zeppelin.spark.SparkInterpreter,org.apache.zeppelin.spark.PySparkInterpreter,org.apache.zeppelin.spark.SparkRInterpreter,org.apache.zeppelin.spark.SparkSqlInterpreter,org.apache.zeppelin.spark.DepInterpreter,org.apache.zeppelin.markdown.Markdown,org.apache.zeppelin.angular.AngularInterpreter,org.apache.zeppelin.shell.ShellInterpreter,org.apache.zeppelin.hive.HiveInterpreter,org.apache.zeppelin.tajo.TajoInterpreter,org.apache.zeppelin.flink.FlinkInterpreter,org.apache.zeppelin.lens.LensInterpreter,org.apache.zeppelin.ignite.IgniteInterpreter,org.apache.zeppelin.ignite.IgniteSqlInterpreter,org.apache.zeppelin.cassandra.CassandraInterpreter,org.apache.zeppelin.geode.GeodeOqlInterpreter,org.apache.zeppelin.postgresql.PostgreSqlInterpreter,org.apache.zeppelin.phoenix.PhoenixInterpreter,org.apache.zeppelin.kylin.KylinInterpreter,org.apache.zeppelin.elasticsearch.ElasticsearchInterpreter,org.apache.zeppelin.scalding.ScaldingInterpreter",
       "zeppelin.ssl":"false",
       "zeppelin.notebook.autoInterpreterBinding":"true",
       "zeppelin.notebook.homescreen":"",