R语言笔记

学习R语言对我来说有好几个地方需要注意的,我觉得这样的经验也适用于学习其他的新的语言。

语言的目标

我理解语言的目标就是这个语言是用来做什么的,为什么样的任务服务的,也就是设计这个语言的动机。比如C++是为系统编程服务的,java是为企业级应用服务的。R语言是用于统计分析,这样在R的系统中有大量的库(或者是package)用来实现特定的统计方法。

基本的数据类型

学习各个语言的第一步是了解这个语言的最基本的数据类型,这决定如何使用变量进行计算。

基本数据类型是直接由语言本身所定义的变量类型。基本数据类型类比于建筑工地上的沙子,你可以建高楼大厦,可以建别墅,但是你没法建沙子啊!!!或者类似于原子,完全不可再分的东西。R语言的基本数据类型包括:

  1. character:字符串类型。
  2. numeric:浮点数,应该是双精度浮点数。
  3. integer:整数
  4. logical value:TURE/FALSE两种
  5. fucntion:函数也是R语言中的基本类型

有NA和NaN两个特别的数据类型,用来表述数据无法获得和不存在这两种情况的。这个也是R语言的特色,一般语言中只存在一种表示非法的数据。

这些数据类型和C语言中的数据类型没有本质的差别。对于“character”,其实是字符串,因此在R语言中没有单个字符和字符串的区别。在基本的数据类型上各个语言可能不会有什么差别(有些语言比如MATLAB,矩阵也是基本数据类型)。

常用的数据类型

学习完基本的数据类型后,下一步应该了解的是这个语言最常用的数据类型。R语言中最常用的数据类型包括:

  1. vector:n个相同数据类型的变量,可以使用vector或者c创建。
  2. list:vector的增强版本,这n个对象可以是不同的数据类型。使用list函数创建。
  3. matrix:矩阵,nxn个相同数据类型的变量在一起,使用matrix创建。
  4. data.frame:类似于矩阵,但是每一列的数据类型可以不同。一般使用data.frame函数创建。
  5. factor:这种数据类型类似于enumeration,但是可以存在顺序,一般统计中用于数据的分类或者排序等等。
  6. Datetime:处理日期时间相关的数据。

对于vector和list来说,相比于C语言,R语言也使用整数下标做索引,但是从1开始,也同样使用"[]"。

对于list,有另外的特别的索引方法:[[]]。这种特别的索引方法正好可以给出R语言作为统计用途的语言与C的差异。R语言可以使用“名字”来对变量进行引用。可以使用名字的原因是统计表格中的每一列一般是有标题的。这样就可以直接使用标题来引用对应的数据。这样的方法对于matrix和data.frame都有效。

对于matrix和data frame来说,索引特定元素的方法是a[i,j],这种方法和c语言也不相同。另外R语言中的各种类型的函数可以使用as函数进行转换。

执行流控制语句

这个也是每个语言的必须的要素,包括判断,循环和跳转语句,这在各个语言中是不一样的,每个语言都有自己的特色,但是基本和C语言相同。

R语言的判断

	if(expression){
expression A
} else {
expression B
}

其中else部分可以省略。R语言中可以产生逻辑结果的操作符有==, !=, >, <, %in%等。

R语言提供了多种类型的循环语句

	for(index in sequence){
expression
} while(expression){
expression
} repeat {
expression
}

其中需要到repeat就是一个死循环,需要使用break才能从结束循环。

类似于MATLAB,在R语言中循环语句是相当的耗费时间的,如果有可能,应当尽量使用*apply函数。

函数

R语言的函数也是基本数据类型的一种,因此被称为first-class citizen。这意味着函数和其他的变量没有什么本质的不同,这一点不同于C语言。另外R语言中的函数允许嵌套定义,而且允许函数中存在函数体内部和全局环境都不可解析的变量,这对于C语言是完全不可接受的,这些在函数体内部和全局环境都不可解析的变量,称之为“free variable”。对于R语言的函数,最重要的知识点就是scoping rule:

a <- 20
f <- function(b){
g <- function() { a + b}
g()
} h <- function(){
a <- 200
b <- 100
f(3)
}

从函数f的定义中我们可以看出\(a\)是free variable,然后在函数h中,我们调用f,同时h内部也出现了变量a。在这个时候,lexical scoping法则规定,这些free variable的取值由函数定义所在的“环境"决定。R语言中的环境定义为一个data frame,里面存储的是一对对的”符号“和”对象“。一个环境可以有父环境,最终的根节点是一个空的环境。因此在任何R的函数对象中必然存在指向环境对象的指针,以用来解析函数中存在的free variable。因此任意符号的解析必然由环境决定的。在上图的调用中,最终的结果是23。

惯用法

相比于前面介绍的基本数据类型,常用数据类型,函数定义(或者是对象定义),这些在每个语言中可能采用不同的规则,但是基本大同小异。如何区分一个初学者和熟练使用的差别,就在于是否会恰当的使用惯用法。各个语言由于特性的不同,对于同一个事情的处理,会有完全不同的处理方法,尽管可以使用一种非常统一的方法在各个语言中实现,但这样的行为注定是要受到鄙视的。

R语言中的惯用法就是*apply函数,这些函数使用的熟练程序,对一个程序的美观可以有很大的影响。主要包括:

  1. lapply/sapply
  2. tapply
  3. mapply
  4. apply

这些函数的用法非常类似于map这种语言,对不同的对象施加同一个操作。

其他

其他的信息包括一些统计时间,获取帮助str,确定程序的热点Rprof。R语言的另一大特色是大量随机事件相关的函数。

总结

在学习新的编程语言时,一般得注意到基本数据类型,常用数据类型,函数定义,变量解析和惯用法。这样基本可以快速的使用一个语言,但是熟练使用仍然需要很长的一段时间。

R语言笔记的更多相关文章

  1. R语言笔记4--可视化

    接R语言笔记3--实例1 R语言中的可视化函数分为两大类,探索性可视化(陌生数据集,不了解,需要探索里面的信息:偏重于快速,方便的工具)和解释性可视化(完全了解数据集,里面的故事需要讲解别人:偏重全面 ...

  2. R语言笔记完整版

    [R笔记]R语言函数总结   R语言与数据挖掘:公式:数据:方法 R语言特征 对大小写敏感 通常,数字,字母,. 和 _都是允许的(在一些国家还包括重音字母).不过,一个命名必须以 . 或者字母开头, ...

  3. R语言笔记:快速入门

    1.简单会话 > x<-c(1,2,4) > x [1] 1 2 4 R语言的标准赋值运算符是<-.也可以用=,不过不建议用它,有些情况会失灵.其中c表示连接(concaten ...

  4. 初探R语言——R语言笔记

    R语言使用 <-  赋值 # 作为注释符号 c()函数用于作为向量赋值,例如age<-c(1,2,3,4,5) mean()用于求向量的平均值 sd()求向量的标准差 cor(a,b)求a ...

  5. R语言笔记5--读数据

    1.读文本文件数据 (1)先设置工作目录,把文本文件放于该目录下 备注:在记事本里写完数据后,按一下回车,负责在R语言中出现错误 (2)读剪贴板 文本或EXCEL的数据均可通过剪贴板操作 (3)读ex ...

  6. R语言笔记1--向量、数组、矩阵、数据框、列表

    注释:R语言是区分大小写的 1.向量 R语言中可以将各种向量赋值为一个变量,这种赋值操作符就是等号“=”,也可以使用“<-”. 1)产生向量 (1)函数c() 例如:x1=c(2,4,6,8,0 ...

  7. 【转】R语言笔记--颜色的使用

    转自该网站:http://research.stowers-institute.org/efg/R/Color/Chart/ 科学可视化中常用的一些颜色表:http://geog.uoregon.ed ...

  8. R语言笔记2--循环、R脚本

    1.循环语句 for语句 while语句 2.R脚本 source()函数 print()函数

  9. r语言笔记 jn

    get_range <- function(data_name , row_name){ library(stringr) load(data_name) data_str <- str_ ...

随机推荐

  1. 【剑指Offer学习】【面试题43 : n 个锻子的点数】

    题目:把n个骰子扔在地上,全部骰子朝上一面的点数之和为s.输入n.打印出s 的全部可能的值出现的概率. 解题思路 解法一:基于通归求解,时间效率不够高. 先把n个骰子分为两堆:第一堆仅仅有一个.还有一 ...

  2. Qt 学习之路 :进程间通信

    上一章我们了解了有关进程的基本知识.我们将进程理解为相互独立的正在运行的程序.由于二者是相互独立的,就存在交互的可能性,也就是我们所说的进程间通信(Inter-Process Communicatio ...

  3. 基于库zkclient 的leader选举代码实现

    利用了zookeeper临时节点,在当连接或session断掉时被删除这一特性来做选举.(简单简单互斥锁) 查了下网上的做法. 大致流程: <1>判定是否存在/wzgtest路径 < ...

  4. C++之智能指针

    导读 一直对智能指针有一种神秘的赶脚,虽然平时没怎么用上智能指针,也就看过STL中的其中一种智能指针auto_ptr,但是一直好奇智能指针的设计因此,今天看了一下<C++ Primer Plus ...

  5. Android(java)学习笔记235:多媒体之计算机图形表示方式

    1.多媒体 很多媒体:文字(TextView,简单不讲),图片,声音,视频等等.   2.图片 计算机如何表示图片的? (1)bmp 高质量保存    256色位图:图片中的每个像素点可以有256种颜 ...

  6. Git和Github的应用与命令方法总结

    title: Git和Github的应用与命令方法总结 date: 2016-07-11 14:03:09 tags: git/github [本文摘抄自微信公众平台:AndroidDeveloper ...

  7. Poj 3368 Frequent values

    /* 线段树区间合并 维护几个信息 到时候乱搞一下就好了 开始T了 有一种情况可以不用递归 直接算出来 */ #include<iostream> #include<cstdio&g ...

  8. JavaScript--对象+函数

    1. 复杂数据类型 Object ECMAScript中的对象其实就是一组数据(属性)和功能(方法)的集合.    1) 创建Object实例:   1.使用构造函数创建,new Object()   ...

  9. Delphi 封装Frame到Dll文件

    做项目的时候,发现这个Frame很好用,为了省空间.调用和修改方便,就将Frame封装到dll(动态链接库)里面,确实很好使. 效果图如下: 上图是临时测试用的,忘了将Frame的align设置成al ...

  10. POJ 2411.Mondriaan's Dream 解题报告

    题意: 给出n*m (1≤n.m≤11)的方格棋盘,用1*2的长方形骨牌不重叠地覆盖这个棋盘,求覆盖满的方案数. Solution:                位运算+状态压缩+dp       ...