HeronStatsPlugins: r-learning.html

File r-learning.html, 43.7 KB (added by dconnolly, 5 years ago)

notes on R and the R conference from a programmer's perspective (generated HTML)

Line 
1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3<!-- saved from url=(0014)about:internet -->
4<html>
5<head>
6<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
7
8<title>R from a Programmer&#39;s Point of View</title>
9
10<base target="_blank"/>
11
12<style type="text/css">
13body, td {
14   font-family: sans-serif;
15   background-color: white;
16   font-size: 12px;
17   margin: 8px;
18}
19
20tt, code, pre {
21   font-family: 'DejaVu Sans Mono', 'Droid Sans Mono', 'Lucida Console', Consolas, Monaco, monospace;
22}
23
24h1 {
25   font-size:2.2em;
26}
27
28h2 {
29   font-size:1.8em;
30}
31
32h3 {
33   font-size:1.4em;
34}
35
36h4 {
37   font-size:1.0em;
38}
39
40h5 {
41   font-size:0.9em;
42}
43
44h6 {
45   font-size:0.8em;
46}
47
48a:visited {
49   color: rgb(50%, 0%, 50%);
50}
51
52pre {   
53   margin-top: 0;
54   max-width: 95%;
55   border: 1px solid #ccc;
56}
57
58pre code {
59   display: block; padding: 0.5em;
60}
61
62code.r {
63   background-color: #F8F8F8;
64}
65
66table, td, th {
67  border: none;
68}
69
70blockquote {
71   color:#666666;
72   margin:0;
73   padding-left: 1em;
74   border-left: 0.5em #EEE solid;
75}
76
77hr {
78   height: 0px;
79   border-bottom: none;
80   border-top-width: thin;
81   border-top-style: dotted;
82   border-top-color: #999999;
83}
84
85@media print {
86   * {
87      background: transparent !important;
88      color: black !important;
89      filter:none !important;
90      -ms-filter: none !important;
91   }
92
93   body {
94      font-size:12pt;
95      max-width:100%;
96   }
97       
98   a, a:visited {
99      text-decoration: underline;
100   }
101
102   hr {
103      visibility: hidden;
104      page-break-before: always;
105   }
106
107   pre, blockquote {
108      padding-right: 1em;
109      page-break-inside: avoid;
110   }
111
112   tr, img {
113      page-break-inside: avoid;
114   }
115
116   img {
117      max-width: 100% !important;
118   }
119
120   @page :left {
121      margin: 15mm 20mm 15mm 10mm;
122   }
123     
124   @page :right {
125      margin: 15mm 10mm 15mm 20mm;
126   }
127
128   p, h2, h3 {
129      orphans: 3; widows: 3;
130   }
131
132   h2, h3 {
133      page-break-after: avoid;
134   }
135}
136
137</style>
138
139<!-- Styles for R syntax highlighter -->
140<style type="text/css">
141   pre .operator,
142   pre .paren {
143     color: rgb(104, 118, 135)
144   }
145
146   pre .literal {
147     color: rgb(88, 72, 246)
148   }
149
150   pre .number {
151     color: rgb(0, 0, 205);
152   }
153
154   pre .comment {
155     color: rgb(76, 136, 107);
156   }
157
158   pre .keyword {
159     color: rgb(0, 0, 255);
160   }
161
162   pre .identifier {
163     color: rgb(0, 0, 0);
164   }
165
166   pre .string {
167     color: rgb(3, 106, 7);
168   }
169</style>
170
171<!-- R syntax highlighter -->
172<script type="text/javascript">
173var hljs=new function(){function m(p){return p.replace(/&/gm,"&amp;").replace(/</gm,"&lt;")}function f(r,q,p){return RegExp(q,"m"+(r.cI?"i":"")+(p?"g":""))}function b(r){for(var p=0;p<r.childNodes.length;p++){var q=r.childNodes[p];if(q.nodeName=="CODE"){return q}if(!(q.nodeType==3&&q.nodeValue.match(/\s+/))){break}}}function h(t,s){var p="";for(var r=0;r<t.childNodes.length;r++){if(t.childNodes[r].nodeType==3){var q=t.childNodes[r].nodeValue;if(s){q=q.replace(/\n/g,"")}p+=q}else{if(t.childNodes[r].nodeName=="BR"){p+="\n"}else{p+=h(t.childNodes[r])}}}if(/MSIE [678]/.test(navigator.userAgent)){p=p.replace(/\r/g,"\n")}return p}function a(s){var r=s.className.split(/\s+/);r=r.concat(s.parentNode.className.split(/\s+/));for(var q=0;q<r.length;q++){var p=r[q].replace(/^language-/,"");if(e[p]){return p}}}function c(q){var p=[];(function(s,t){for(var r=0;r<s.childNodes.length;r++){if(s.childNodes[r].nodeType==3){t+=s.childNodes[r].nodeValue.length}else{if(s.childNodes[r].nodeName=="BR"){t+=1}else{if(s.childNodes[r].nodeType==1){p.push({event:"start",offset:t,node:s.childNodes[r]});t=arguments.callee(s.childNodes[r],t);p.push({event:"stop",offset:t,node:s.childNodes[r]})}}}}return t})(q,0);return p}function k(y,w,x){var q=0;var z="";var s=[];function u(){if(y.length&&w.length){if(y[0].offset!=w[0].offset){return(y[0].offset<w[0].offset)?y:w}else{return w[0].event=="start"?y:w}}else{return y.length?y:w}}function t(D){var A="<"+D.nodeName.toLowerCase();for(var B=0;B<D.attributes.length;B++){var C=D.attributes[B];A+=" "+C.nodeName.toLowerCase();if(C.value!==undefined&&C.value!==false&&C.value!==null){A+='="'+m(C.value)+'"'}}return A+">"}while(y.length||w.length){var v=u().splice(0,1)[0];z+=m(x.substr(q,v.offset-q));q=v.offset;if(v.event=="start"){z+=t(v.node);s.push(v.node)}else{if(v.event=="stop"){var p,r=s.length;do{r--;p=s[r];z+=("</"+p.nodeName.toLowerCase()+">")}while(p!=v.node);s.splice(r,1);while(r<s.length){z+=t(s[r]);r++}}}}return z+m(x.substr(q))}function j(){function q(x,y,v){if(x.compiled){return}var u;var s=[];if(x.k){x.lR=f(y,x.l||hljs.IR,true);for(var w in x.k){if(!x.k.hasOwnProperty(w)){continue}if(x.k[w] instanceof Object){u=x.k[w]}else{u=x.k;w="keyword"}for(var r in u){if(!u.hasOwnProperty(r)){continue}x.k[r]=[w,u[r]];s.push(r)}}}if(!v){if(x.bWK){x.b="\\b("+s.join("|")+")\\s"}x.bR=f(y,x.b?x.b:"\\B|\\b");if(!x.e&&!x.eW){x.e="\\B|\\b"}if(x.e){x.eR=f(y,x.e)}}if(x.i){x.iR=f(y,x.i)}if(x.r===undefined){x.r=1}if(!x.c){x.c=[]}x.compiled=true;for(var t=0;t<x.c.length;t++){if(x.c[t]=="self"){x.c[t]=x}q(x.c[t],y,false)}if(x.starts){q(x.starts,y,false)}}for(var p in e){if(!e.hasOwnProperty(p)){continue}q(e[p].dM,e[p],true)}}function d(B,C){if(!j.called){j();j.called=true}function q(r,M){for(var L=0;L<M.c.length;L++){if((M.c[L].bR.exec(r)||[null])[0]==r){return M.c[L]}}}function v(L,r){if(D[L].e&&D[L].eR.test(r)){return 1}if(D[L].eW){var M=v(L-1,r);return M?M+1:0}return 0}function w(r,L){return L.i&&L.iR.test(r)}function K(N,O){var M=[];for(var L=0;L<N.c.length;L++){M.push(N.c[L].b)}var r=D.length-1;do{if(D[r].e){M.push(D[r].e)}r--}while(D[r+1].eW);if(N.i){M.push(N.i)}return f(O,M.join("|"),true)}function p(M,L){var N=D[D.length-1];if(!N.t){N.t=K(N,E)}N.t.lastIndex=L;var r=N.t.exec(M);return r?[M.substr(L,r.index-L),r[0],false]:[M.substr(L),"",true]}function z(N,r){var L=E.cI?r[0].toLowerCase():r[0];var M=N.k[L];if(M&&M instanceof Array){return M}return false}function F(L,P){L=m(L);if(!P.k){return L}var r="";var O=0;P.lR.lastIndex=0;var M=P.lR.exec(L);while(M){r+=L.substr(O,M.index-O);var N=z(P,M);if(N){x+=N[1];r+='<span class="'+N[0]+'">'+M[0]+"</span>"}else{r+=M[0]}O=P.lR.lastIndex;M=P.lR.exec(L)}return r+L.substr(O,L.length-O)}function J(L,M){if(M.sL&&e[M.sL]){var r=d(M.sL,L);x+=r.keyword_count;return r.value}else{return F(L,M)}}function I(M,r){var L=M.cN?'<span class="'+M.cN+'">':"";if(M.rB){y+=L;M.buffer=""}else{if(M.eB){y+=m(r)+L;M.buffer=""}else{y+=L;M.buffer=r}}D.push(M);A+=M.r}function G(N,M,Q){var R=D[D.length-1];if(Q){y+=J(R.buffer+N,R);return false}var P=q(M,R);if(P){y+=J(R.buffer+N,R);I(P,M);return P.rB}var L=v(D.length-1,M);if(L){var O=R.cN?"</span>":"";if(R.rE){y+=J(R.buffer+N,R)+O}else{if(R.eE){y+=J(R.buffer+N,R)+O+m(M)}else{y+=J(R.buffer+N+M,R)+O}}while(L>1){O=D[D.length-2].cN?"</span>":"";y+=O;L--;D.length--}var r=D[D.length-1];D.length--;D[D.length-1].buffer="";if(r.starts){I(r.starts,"")}return R.rE}if(w(M,R)){throw"Illegal"}}var E=e[B];var D=[E.dM];var A=0;var x=0;var y="";try{var s,u=0;E.dM.buffer="";do{s=p(C,u);var t=G(s[0],s[1],s[2]);u+=s[0].length;if(!t){u+=s[1].length}}while(!s[2]);if(D.length>1){throw"Illegal"}return{r:A,keyword_count:x,value:y}}catch(H){if(H=="Illegal"){return{r:0,keyword_count:0,value:m(C)}}else{throw H}}}function g(t){var p={keyword_count:0,r:0,value:m(t)};var r=p;for(var q in e){if(!e.hasOwnProperty(q)){continue}var s=d(q,t);s.language=q;if(s.keyword_count+s.r>r.keyword_count+r.r){r=s}if(s.keyword_count+s.r>p.keyword_count+p.r){r=p;p=s}}if(r.language){p.second_best=r}return p}function i(r,q,p){if(q){r=r.replace(/^((<[^>]+>|\t)+)/gm,function(t,w,v,u){return w.replace(/\t/g,q)})}if(p){r=r.replace(/\n/g,"<br>")}return r}function n(t,w,r){var x=h(t,r);var v=a(t);var y,s;if(v){y=d(v,x)}else{return}var q=c(t);if(q.length){s=document.createElement("pre");s.innerHTML=y.value;y.value=k(q,c(s),x)}y.value=i(y.value,w,r);var u=t.className;if(!u.match("(\\s|^)(language-)?"+v+"(\\s|$)")){u=u?(u+" "+v):v}if(/MSIE [678]/.test(navigator.userAgent)&&t.tagName=="CODE"&&t.parentNode.tagName=="PRE"){s=t.parentNode;var p=document.createElement("div");p.innerHTML="<pre><code>"+y.value+"</code></pre>";t=p.firstChild.firstChild;p.firstChild.cN=s.cN;s.parentNode.replaceChild(p.firstChild,s)}else{t.innerHTML=y.value}t.className=u;t.result={language:v,kw:y.keyword_count,re:y.r};if(y.second_best){t.second_best={language:y.second_best.language,kw:y.second_best.keyword_count,re:y.second_best.r}}}function o(){if(o.called){return}o.called=true;var r=document.getElementsByTagName("pre");for(var p=0;p<r.length;p++){var q=b(r[p]);if(q){n(q,hljs.tabReplace)}}}function l(){if(window.addEventListener){window.addEventListener("DOMContentLoaded",o,false);window.addEventListener("load",o,false)}else{if(window.attachEvent){window.attachEvent("onload",o)}else{window.onload=o}}}var e={};this.LANGUAGES=e;this.highlight=d;this.highlightAuto=g;this.fixMarkup=i;this.highlightBlock=n;this.initHighlighting=o;this.initHighlightingOnLoad=l;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="\\b(0[xX][a-fA-F0-9]+|(\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|\\.|-|-=|/|/=|:|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.ER="(?![\\s\\S])";this.BE={b:"\\\\.",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.inherit=function(r,s){var p={};for(var q in r){p[q]=r[q]}if(s){for(var q in s){p[q]=s[q]}}return p}}();hljs.LANGUAGES.r={dM:{c:[hljs.HCM,{cN:"number",b:"\\b0[xX][0-9a-fA-F]+[Li]?\\b",e:hljs.IMMEDIATE_RE,r:0},{cN:"number",b:"\\b\\d+(?:[eE][+\\-]?\\d*)?L\\b",e:hljs.IMMEDIATE_RE,r:0},{cN:"number",b:"\\b\\d+\\.(?!\\d)(?:i\\b)?",e:hljs.IMMEDIATE_RE,r:1},{cN:"number",b:"\\b\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",e:hljs.IMMEDIATE_RE,r:0},{cN:"number",b:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",e:hljs.IMMEDIATE_RE,r:1},{cN:"keyword",b:"(?:tryCatch|library|setGeneric|setGroupGeneric)\\b",e:hljs.IMMEDIATE_RE,r:10},{cN:"keyword",b:"\\.\\.\\.",e:hljs.IMMEDIATE_RE,r:10},{cN:"keyword",b:"\\.\\.\\d+(?![\\w.])",e:hljs.IMMEDIATE_RE,r:10},{cN:"keyword",b:"\\b(?:function)",e:hljs.IMMEDIATE_RE,r:2},{cN:"keyword",b:"(?:if|in|break|next|repeat|else|for|return|switch|while|try|stop|warning|require|attach|detach|source|setMethod|setClass)\\b",e:hljs.IMMEDIATE_RE,r:1},{cN:"literal",b:"(?:NA|NA_integer_|NA_real_|NA_character_|NA_complex_)\\b",e:hljs.IMMEDIATE_RE,r:10},{cN:"literal",b:"(?:NULL|TRUE|FALSE|T|F|Inf|NaN)\\b",e:hljs.IMMEDIATE_RE,r:1},{cN:"identifier",b:"[a-zA-Z.][a-zA-Z0-9._]*\\b",e:hljs.IMMEDIATE_RE,r:0},{cN:"operator",b:"<\\-(?!\\s*\\d)",e:hljs.IMMEDIATE_RE,r:2},{cN:"operator",b:"\\->|<\\-",e:hljs.IMMEDIATE_RE,r:1},{cN:"operator",b:"%%|~",e:hljs.IMMEDIATE_RE},{cN:"operator",b:">=|<=|==|!=|\\|\\||&&|=|\\+|\\-|\\*|/|\\^|>|<|!|&|\\||\\$|:",e:hljs.IMMEDIATE_RE,r:0},{cN:"operator",b:"%",e:"%",i:"\\n",r:1},{cN:"identifier",b:"`",e:"`",r:0},{cN:"string",b:'"',e:'"',c:[hljs.BE],r:0},{cN:"string",b:"'",e:"'",c:[hljs.BE],r:0},{cN:"paren",b:"[[({\\])}]",e:hljs.IMMEDIATE_RE,r:0}]}};
174hljs.initHighlightingOnLoad();
175</script>
176
177
178
179
180</head>
181
182<body>
183<p>up to: <a href="http://informatics.kumc.edu/work/wiki/HeronStatsPlugins">HeronStatsPlugins</a></p>
184
185<h1>R from a Programmer&#39;s Point of View</h1>
186
187<p>by Dan Connolly</p>
188
189<p>These are some notes on R from <a href="http://biostat.mc.vanderbilt.edu/wiki/Main/UseR-2012">The 8th International R User Conference</a> in Nashville, June 2012.</p>
190
191<p>In a lot of ways, R is a little like JavaScript: scheme with C-like syntax. It&#39;s a dynamic language, much like python or ruby, with a large standard library for math and statistics:</p>
192
193<pre><code class="r">1 + 1
194</code></pre>
195
196<pre><code>## [1] 2
197</code></pre>
198
199<pre><code class="r">sin(pi/2)
200</code></pre>
201
202<pre><code>## [1] 1
203</code></pre>
204
205<h2>Vectors Everywhere</h2>
206
207<p>The first thing to get used to is: there are no scalars. The most primitive datatype is vector:</p>
208
209<pre><code class="r">sizes &lt;- c(2, 4, 6, 8)
210sizes * 3
211</code></pre>
212
213<pre><code>## [1]  6 12 18 24
214</code></pre>
215
216<pre><code class="r">sin(pi/sizes)
217</code></pre>
218
219<pre><code>## [1] 1.0000 0.7071 0.5000 0.3827
220</code></pre>
221
222<pre><code class="r">sizes + 1:4
223</code></pre>
224
225<pre><code>## [1]  3  6  9 12
226</code></pre>
227
228<pre><code class="r">sizes + 0:1
229</code></pre>
230
231<pre><code>## [1] 2 5 6 9
232</code></pre>
233
234<pre><code class="r">set.seed(1234)
235round(runif(3, min = 0, max = 5))
236</code></pre>
237
238<pre><code>## [1] 1 3 3
239</code></pre>
240
241<p>c() is for concatenate. 1:3 is short for seq(from=1, to=3). Note that adding a short vector (0:1) to a long vector wraps the short one.</p>
242
243<h2>Copy on write, no sharing</h2>
244
245<p>Assignment in R is more like php than python: vectors get copied:</p>
246
247<pre><code class="r">x &lt;- c(1, 2, 3)
248y &lt;- x
249x[2] = 9
250x
251</code></pre>
252
253<pre><code>## [1] 1 9 3
254</code></pre>
255
256<pre><code class="r">y
257</code></pre>
258
259<pre><code>## [1] 1 2 3
260</code></pre>
261
262<p>Indexing starts at 1, as opposed to 0 as in C etc.</p>
263
264<h2>Assignment, or &ldquo;gets&rdquo;</h2>
265
266<p>R has a slightly novel approach to the = vs == syntax:</p>
267
268<pre><code class="r">a &lt;- 2
269a * a
270</code></pre>
271
272<pre><code>## [1] 4
273</code></pre>
274
275<p>Using = in place of &lt;- reportedly works <em>almost</em> everywhere, but it&#39;s frowned upon.</p>
276
277<p>But that&#39;s a minor issue.</p>
278
279<h2>Argument evaluation, delayed</h2>
280
281<p>The stuff that turns your head sideways is lazy/delayed evaluation of arguments:</p>
282
283<pre><code class="r">ignore.first &lt;- function(a, b) {
284    b * 2
285}
286ignore.first(1/0, 3)
287</code></pre>
288
289<pre><code>## [1] 6
290</code></pre>
291
292<p>Argument evaluation is not only delayed  but the so-called promises (the R manual calls them promises, but since they can&#39;t be broken, that&#39;s something of a misnomer) include the expression:</p>
293
294<pre><code class="r">expression.parts &lt;- function(e) {
295    substitute(e)
296}
297expression.parts(x + y * z)
298</code></pre>
299
300<pre><code>## x + y * z
301</code></pre>
302
303<p>That looks pretty wonky from the perspective of most general-purpose computing languages, but it makes a lot of sense when doing statistical modelling and plotting, as we&#39;ll see below.</p>
304
305<h2>Working with data in dataframes</h2>
306
307<p>Modelling typically starts with some data. We&#39;ll synthesize it here, using the workhorse dataframe (much like a database table):</p>
308
309<pre><code class="r">speeds &lt;- runif(10, min = 25, max = 50)
310erf &lt;- function(x) 2 * pnorm(x * sqrt(2)) - 1
311stopping &lt;- data.frame(speed = speeds, distance = (speeds^2 + erf(speeds)))
312</code></pre>
313
314<h2>Formulas in Interactive Plotting</h2>
315
316<p>Interactive visualization through plotting is one use of unevaluated arguments. We can plot stopping distance as a function of speed.</p>
317
318<pre><code class="r">plot(distance ~ speed, stopping)
319</code></pre>
320
321<p><img src="data:image/png;base64,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" alt="plot of chunk unnamed-chunk-8"/> </p>
322
323<p>The parabola becomes more clear if we zoom out to include the origin:</p>
324
325<pre><code class="r">plot(distance ~ speed, stopping, xlim = c(0, max(stopping$speed)),
326    ylim = c(0, max(stopping$distance)))
327</code></pre>
328
329<p><img src="data:image/png;base64,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" alt="plot of chunk unnamed-chunk-9"/> </p>
330
331<h2>Formulas in linear models</h2>
332
333<p>Another use of unevaluated formulas is linear models; I don&#39;t yet understand them, but I gather they&#39;re a mainstay of analysis with R:</p>
334
335<pre><code class="r">m &lt;- lm(distance ~ 0 + speed^2, stopping)
336coef(m)
337</code></pre>
338
339<pre><code>## speed
340## 39.51
341</code></pre>
342
343<h2>The R Learning Cliff</h2>
344
345<p>“I’m going to assume you know what a generalized linear model is,” said Bill Venables in the R short course. Nowhere in the R world is there a definition of basic concepts such as linear model or standard deviation. The help for sd says:</p>
346
347<blockquote>
348<p>This function computes the standard deviation of the values in x.</p>
349</blockquote>
350
351<p>Gee, thanks. The reference to the var function looked promising, but nope. They just bottom out with</p>
352
353<blockquote>
354<h2>References</h2>
355
356<p>Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth &amp; Brooks/Cole.</p>
357</blockquote>
358
359<p>In fairness, I suppose the python docs for sort() don&#39;t spell out how to sort items in a list.</p>
360
361<p>So then it’s off to wikipedia’s statistics materials; but I haven’t found a good connection between what I know (set theory, discrete mathematics, real analysis, toplogy) and the foundations of statistics. I understand some examples and special cases, but not many general definitions.</p>
362
363<h2>R help is &ldquo;obtuse&rdquo;</h2>
364
365<p>In the &ldquo;crash course&rdquo; tutorial, I learned I&#39;m not the only one who doesn&#39;t find R&#39;s help very helpful: “frequently the complaint about R help is that the help is obtuse. Far too subtle for mere mortals. To get help with xyz, search for R xyz example”</p>
366
367<h2>R Development Tools</h2>
368
369<p>Bill Venables uses ESS, the R mode for Emacs, but says these days he’d recommend R Studio.</p>
370
371<p>I used Emacs + ESS when developing rgate. Since I&#39;d rather not infect the next generation with the emacs virus, I installed R for Eclipse in preparation for the conference. But I don&#39;t think I&#39;ve used R for Eclipse since.</p>
372
373<p>The talk by the Rstudio guys (JJ Alair, who developed ColdFusion etc.) was pretty cool. I&#39;m using Rstudio and the MarkDown integration to draft this little article. <a href="http://yihui.name/knitr">Knitter</a> is cool, but this &ldquo;literate programming&rdquo;&ldquo; style seems somewhat inside-out, to me. I prefer to generate documentation from the normal source code. (.R, .py, .C) a la doxygen, doctest, sphynx. But I&#39;m giving it a try.</p>
374
375<h2>doctest for R? Almost&hellip;</h2>
376
377<p>In the crash course (slide: &quot;Unit tests in R&rdquo;) I learned about a convention for mixing runnable examples with package documentation (*.Rd), much like python&#39;s doctest. Yay!</p>
378
379<p>But&hellip; the conventions don&#39;t include checking that the output of the examples matches any expected results. Sigh. So close.</p>
380
381<p>I suppose one could add something to make the examples fail if they don&#39;t produce the expected results. That&#39;s possibly useful, but not nearly as useful as an established community norm for doing so.</p>
382
383<p>Wickham’s devtools package looks interesting. (Wickham is clearly a leading light&hellip; his ggplot2 was used everywhere.)</p>
384
385<h2>R performance, profiling</h2>
386
387<p>Performance was a theme of the conference (as well as reproducible research, which is another article altogether).</p>
388
389<p>Norm Matloff gave a great invited talk (<a href="http://heather.cs.ucdavis.edu/UseR2012.pdf">slides</a>) on <strong>Parallel R, Revisited</strong>, summarizing major hardware trends, e.g.</p>
390
391<ul>
392<li>NVIDIA currently dominant in the GPU world. Intel likely to enter the market, with the obvious fragmentation risk.</li>
393<li>Knight’s Ferry “next year” for several years</li>
394<li>CUDA currently dominant</li>
395<li>OpenCL stalled?</li>
396<li>OpenACC - a la openmp</li>
397</ul>
398
399<p>Then he showed his &ldquo;software alchemy&rdquo; technique, which achieves super-linear speedup in some applications that seemed common/important.</p>
400
401<p>Another talk by <strong>Justin Talbot</strong> went into more detail. He reminded us that clock speed topped out in ~2003 at ~3Ghz, but 2 to 4 cores is consumer technology today and he expectes 8 to 16 cores on laptops in ~5 years. Memory isn’t getting much faster either. Since we have more cores, we’re memory-starved. Have to do more with registers and caches.</p>
402
403<p>He noted 3 distinct performance areas in R: scalar (interpreter), matrix, and vector. The conventional wisdom is that vector operations in R are as fast as C code, but he found that they were only as fast as <em>poorly written</em> C code (too many copies); 7% as fast as hand-tuned C code. So he was able to get 60x speed-up through a combination of better C code and multi-core use.</p>
404
405<p>Tim Hesterberg from Google gave an invited talk including speeding up dataframes&hellip; reducing the number of copies from 8 to 3 in some common operations. He mentioned a few ways to find out what to optimize: tracemem, Rprofmem, &ndash;enable-memory-profiling</p>
406
407</body>
408
409</html>
410