{ "metadata": { "language": "haskell", "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Rlang-QQ is a way to call the R language interpreter from haskell.\n", "This demo shows how to plot things with it, and include those plots\n", "in the IHaskell notebook. Ideally this example will become a 4 liner\n", "when a new variation of the `r` quasiquote is written." ] }, { "cell_type": "code", "collapsed": false, "input": [ "{-# LANGUAGE QuasiQuotes #-} -- should enable the extension, but it doesn't for now\n", ":extension QuasiQuotes\n", "import RlangQQ\n", "import IHaskell.Display" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "let fn = \"tmp1\" -- should come from a global variable...\n", "let npts = 100 :: Double -- cannot leave out the above let\n", "let sins = map sin [ 2*pi * x / npts | x <- [1 .. npts] ]\n", " \n", " \n", "[r| # an R function to make png and svg plots,\n", " # ideally this part is hidden and we replay plots\n", " # just like knitr (evaluate package) with code\n", " # the user does not have to write out\n", " pp <- function(p) {\n", " svg(paste0($(fn), \".svg\"))\n", " p()\n", " dev.off()\n", " png(paste0($(fn), \".png\"))\n", " p()\n", " dev.off()\n", " }\n", "\n", " pp(function() plot( $(sins), type ='l'))\n", " |]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "text": [] } ], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "import qualified Data.ByteString as B\n", "import qualified Data.ByteString.Base64 as Base64\n", "import qualified Data.ByteString.Char8 as Char" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "do\n", " pp <- B.readFile (fn++\".png\")\n", " ps <- hGetContents =<< openBinaryFile (fn++\".svg\") ReadMode\n", " length ps `seq` return () -- lazy IO?\n", " return [png 800 400 (Char.unpack (Base64.encode pp)), svg ps]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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", "svg": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", " \n", "\n", "\n", " \n", " \n", "\n", "\n", " \n", " \n", "\n", "\n", " \n", " \n", "\n", "\n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "\n", "\n" ] } ], "prompt_number": 4 } ], "metadata": {} } ] }