[速成法] R  

night_stalker 2010-09-30
好久没 helloworld 一把了,这次的目标是 R !

What is R and download and documents:
http://www.r-project.org/

下面开始各种动手。

交互 shell

搜索
?dim

全文搜索
??dim

自动完成
as.<按 tab>

基本语法

类型
1    double
1L   整数
1+0i 复数
typeof(1)
NULL 空表或者未赋值
'a'  字符串
"a"  字符串

赋值
a <- 2 + 2

函数
f <- function(n) { n * 4 }
f(12)

赋值形式的函数 (think about x.class = "foo")
class(x) <- "foo"

向量和 range
v <- c(1,2,4)
v <- 1:12

矩阵是有 dim 和 dimnames 属性(一般为 NULL)的向量
3行4列矩阵:
v <- 1:12
dim(v) <- c(3,4)

操作符分为 3 种(unary, binary, vectorized)
-	Minus, can be unary or binary 
+	Plus, can be unary or binary 
!	Unary not 
~	Tilde, used for model formulae, can be either unary or binary 
?	Help 
:	Sequence, binary (in model formulae: interaction) 
*	Multiplication, binary 
/	Division, binary 
^	Exponentiation, binary 
%x%	Special binary operators, x can be replaced by any valid name 
%%	Modulus, binary 
%/%	Integer divide, binary 
%*%	Matrix product, binary 
%o%	Outer product, binary 
%x%	Kronecker product, binary 
%in%	Matching operator, binary (in model formulae: nesting) 
<	Less than, binary 
>	Greater than, binary 
==	Equal to, binary 
>=	Greater than or equal to, binary 
<=	Less than or equal to, binary 
&	And, binary, vectorized 
&&	And, binary, not vectorized 
|	Or, binary, vectorized 
||	Or, binary, not vectorized 
<-	Left assignment, binary 
->	Right assignment, binary 
$	List subset, binary

用 backtick 可以把操作符转换成函数:
`+`(1,2)


+ 和 * 等操作符可以直接操作 vector

statement 有值,下面 statement 的值为 9
{
  x <- 4
  x + 5
}

:和 javascript 一样,statement 的花括号不产生局部作用域

控制结构 statement
if (statement1) statement2 else statement3
repeat block_statement
while (statement1) statement2
for (name in vector) statement1
switch (statement, list)

switch 例:
> y <- "fruit"
> switch(y, fruit = "banana", vegetable = "broccoli", meat = "beef")
[1] "banana"


基本运算的一些法则

循环法则:
1.如果让两个元素个数不同的结构相加,短的会循环补足长度。
2.如果有一个长度为0,结果长度也为0。
如果把 c(1,2,3) 加到一个长度为 6 的 vector 上,那么就相当于加 c(1,2,3,1,2,3)

名字传递:
first one wins

维度:
矩阵+矩阵,维度必须相同
矢量+矩阵,先 recycle,再检查维度
例如
> x
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
> c(1,2)+x
     [,1] [,2] [,3]
[1,]    2    6    8
[2,]    4    6   10
[3,]    4    8   10
警告信息:
In c(1, 2) + x : 长的对象长度不是短的对象长度的整倍数

以上代码中,由循环法则, c(1,2) 变成了 c(1,2,1,2,1,2,1,2,1)

NA: 统计中不存在的量
NaN: 除 0 产生的结果

zz了,明天继续 ...
night_stalker 2010-09-30
rinruby 是在 ruby 中调用 R 解释器的接口。和 rsruby 相比,只有纯 ruby 的程序(通过检测机器上已经安装的 R,启动一个 Rterm 进行 eval),安装简单很多:
gem in rinruby


创建一个解释器实例
R = nil # 禁止默认的 session
require 'rinruby'
r = Rinruby.new false


操作
# 赋值
r.assign 'x', 12

# 运算
r.eval 'x <- c(3, 4, 5) + x'

# 取值
r.pull 'x'


退出
r.quit


例如画个直方图
# coding: utf-8
require "rinruby"
R.eval 'x<-rnorm(100)'
R.eval 'hist(x, col="light blue")'
# R.eval 'savePlot("t.png", type="png")' # 保存到文件
gets # hang on,等待结果


比起 rsruby,rinruby 的方式慢一些(需要和解释器之间进行 socket 通信),但是不依赖于特定的 R runtime。比起直接用 system 调用 R,要快一些而且可以进行交互。保持一个 R 的实例进行重复的操作可以减少很多初始化 R 运行时的开销。
Saito 2010-10-01
原来你R了..

那天我还准备给你说用R画一些图表什么的..

后来压抑了内心的欲火..
RednaxelaFX 2010-10-01
你们是怎么踏入了R之领域的……契机是啥?
fireflyman 2010-10-01
R能做什么?
night_stalker 2010-10-01
统计和数值计算,做的和 matlab 差不多的事。
功能可能比 matlab 少点,但是语言很有爱 ……
IDE 比 matlab 简单流畅 (matlab 太巨大,而且那个 java 写的界面慢死了……)

──────────────────────────────────────

其实是数学组有人 zz 了一篇孟岩的 "什么是矩阵" (让人很想喷一喷),然后在
reddit 看到推销 GNU Octave 的贴子,然后就 …… 开始看 R 了 ……
lucane 2010-10-01
观摩高手  
Global site tag (gtag.js) - Google Analytics