-
R语言笔记7:functions——编写函数所需的基础知识
2018-03-21 14:03:23上一讲通过三个简单的例子体验了一下如何在R中写函数,下面来详细学习有关R语言中函数的知识。 Functions in R 主要分三个部分来讲解函数: 编写函数所需的基础知识 相关语法作用域 R语言作用域的规则 ...上一讲通过三个简单的例子体验了一下如何在R中写函数,下面来详细学习有关R语言中函数的知识。
Functions in R
主要分三个部分来讲解函数:
- 编写函数所需的基础知识
- 相关语法作用域
- R语言作用域的规则
编写函数所需的基础知识
R语言通过
function()
指令来命名和创建函数。首先要给函数赋值,也就是命名,然后在小括号中写入参数,最后再大括号中写入函数要执行的语句,其基本语法是:f <- function(<arguments>){ ## Do something interesting }
同时在R中,你可以将函数作为参数传递给其他函数,即嵌套。
函数的返回值是函数执行部分中的最后一行表达式。
编写函数的过程中我们可以设置和命名参数,这些参数可以代表数值、矩阵、数据框或逻辑值等等。同时也可以设置一些具有缺省值(默认值)的参数。
- 形式参数(formal arguments)
形式参数是包含在函数定义里的参数。
formals()
会将一个函数作为输入(input),并返回函数所有的形式参数组成的列表。在R中,不是所有命令都用到所用的形式参数。加入一个函数中设置了10个参数,但我们往往并不需要指定每个参数的值是啥,所以函数可以缺失某些参数。当没有明确赋值是,它的取值就是缺省值(默认值,default value)
- 匹配参数(argument matching)
可以根据位置或名称来匹配函数参数,这是编写和调用函数的关键。
以计算数据标准差的函数
sd()
为例。> data <- rnorm(100) ## 取100个符合正态分布的随机数 > sd(x = data) ## 给参数赋值 求标准差 [1] 1.035329 > sd(data) ## 给参数默认赋值 [1] 1.035329 > sd(data, na.rm = FALSE) [1] 1.035329 > sd(na.rm = FALSE, data) ## 调换参数位置后结果不变 [1] 1.035329
以上所有表达式都是等价的,但是最好不要调换参数位置。
如果函数中参数较多,那么最好使用位置匹配。
比如
lm()
函数(把数据拟合到线性模型),它的参数列表这么长:> args(lm) function (formula, data, subset, weights, na.action, method = "qr", model = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE, contrasts = NULL, offset, ...) NULL
前五个参数都没有缺省值,依次是,公式、数据、子集、权重等。这里使用者必须要指定他们的值。
lm(y ~ x, mydata, 1:100, model = FALSE)
大多数情况下,我们不知道参数的具体位置,所以在命令行中,命名参数来匹配最安全。
The order of operations when given an argument is:
- Check for exact match for a named argument
- Check for a partial match
- Check for a positional match
- 惰性求值(Lazy Evaluation)
惰性求值是R语言的一个关键特性,也是许多编程语言常用的模型。仅在使用函数参数时对其求值。
第一个例子:
> f <- function(a, b) { + a^2 + } > f(2) [1] 4
这里定义函数f,有两个参数,但返回值仅仅是a的平方。所以当运行f(2)时,和b无关,所以系统自动跳过,不会报错。
第二个例子:
> f <- function(a, b) { + print(a) + print(b) + } > f(45) [1] 45 Error in print(b): argument "b" is missing, with no default
这里同样定义f有两个参数,但返回值是a和b,所以当输入f(45)时,因为第二个位置上缺少b的赋值,所以会报错。这里就是用了惰性求值,即,仅在使用这个参数的时候进行求值,在这之前的程序都是有效的并可以执行,直至运行到出错的部分。
- 特殊参数
...
...
参数是一种特殊的参数,表明一些可以传递给另一个函数的参数。常用于当你需要扩展另一个函数,而你又不想复制原函数的整个参数列表时。如下例,你希望修改
plot()
函数中的个别参数,而其他参数保持不变,将其应用于一个新定义的函数中myplot()
:myplot <- function(x, y, type = "l", ...) { plot(x, y, type = type, ...) ## Pass '...' to 'plot' function }
在泛型函数(generic function)中,
...
还有另一种用法,它的作用是根据数据类型使用合适的方法泛型函数是一个函数族,其中的每个函数都有相似的功能,但是适用于某个特定的类。
> mean function (x, ...) UseMethod("mean") <bytecode: 0x5d5e3e8> <environment: namespace:base>
还有一种情况下,
...
参数必须使用:那就是,当传递到函数的参数数量不能事先确定的时候。
比如
paste()
函数,他的作用是将一连串字符串连接起来,然后新建一个字符串或向量,所以无法预知参数个数:> args(paste) function (..., sep = " ", collapse = NULL) NULL
还有
cat()
函数,它的功能是和paste
相似,也是连接字符串。> args(cat) function (..., file = "", sep = " ", fill = FALSE, labels = NULL, append = FALSE) NULL
使用
...
函数的一个注意事项:就是任何出现在
...
之后的参数列表必须明确的给出名称。而且不能够部分匹配或位置匹配举例:
> paste("a","b",sep = ":") [1] "a:b"
不能位置匹配或部分匹配:
> paste("a","b",":") [1] "a b :" > paste("a","b",se = ":") [1] "a b :"
参考资料:
1. 视频课程 R Programming by Johns Hopkins University:https://www.coursera.org/learn/r-programming/home/welcome
2. 讲义 Programming for Data Science :https://bookdown.org/rdpeng/rprogdatascience/R -
Linux下R语言参数传递
2019-01-29 11:47:14Linux下构建R语言统计模型,前端输入参数,后端获取接受参数,运行程序脚本得到分析结果。都离不开参数的传递。参数传递分为形参和是实参。 形参:指出现在Sub 和Function过程形参表中的变量名、数组名,该过程在被...Linux下构建R语言统计模型,前端输入参数,后端获取接受参数,运行程序脚本得到分析结果。都离不开参数的传递。参数传递分为形参和是实参。
形参:指出现在Sub 和Function过程形参表中的变量名、数组名,该过程在被调用前,没有为它们分配内存,其作用是说明自变量的类型和形态以及在过程中的作用。形参可以是除定长字符串变量之外的合法变量名,也可以带括号的数组名。
实参:实参就是在调用Sub 和Function过程时,从主调过程传递给被调用过程的参数值。实参可以是变量名、数组名、常数或表达式。在过程调用传递参数时,形参与实参是按位置结合的,形参表和实参表中对应的变量名可以不必相同,但它们的数据类型、参数个数及位置必须一一对应。
linux下的R语言的参数传递,可理解是将A值传入到B值中。 大致过程如下:
1.首先linux界面执行脚本和参数序号,如下所示:
Rscript test.R 参数1 参数2 ...
2.在test.R 脚本中进行参数获取系统中得到Args的序号对应数值:
Args <- commandArgs()
上述的commandArgs(),是R自带的参数传递函数**,属于位置参数。**运行Rscript后test.R脚本中将得到Args[1]和Args[2]的含义值。
Args[1]= "参数1" Args[2]= "参数2"
3.操作演示方法一:
[root@tandelin home]# vi test.R Args <- commandArgs() print(Args[1]) print(Args[2])
保存后,在参数终端执行
[root@tandelin home]# Rscript test.R input1 input2
运行查看结果
[root@tandelin home]# Rscript test.R $input1 $input2 [1] "/usr/lib64/R/bin/exec/R" [1] "--slave
4.操作演示方法二:
[root@tandelin home]# input1=10 [root@tandelin home]# input2=20
赋值参数传入运行:
[root@tandelin home]# Rscript test.R $input1 $input2 [1] "10" [1] "20"
最终想在固定路径下获取数据,进行输入参数即可得到指定路径下的数据名称。
[root@tandelin home]#input=“/home/data.csv” [root@tandelin home]#Rscript test.R $input PArameter=print( Args[1] ) newdata=read.csv( PArameter ) [1] "1" "3" "1" "3" [2] "1" "3" "1" "3" [3] "1" "3" "1" "3" [4] "1" "3" "1" "3" [5] "1" "3" "1" "3" [6] "1" "3" "1" "3"
以上就完成了基本的参数传递,后续细化,即可得到较好的数值/路径引入。
-
第一章,初学R语言
2016-04-24 15:06:20学习R语言,肯定要清楚它能干嘛,它的作用就是把常见的统计方法封装起来了,直接调用起来就非常简单了。比如means(obeject),这就是一个求均值的方法,直接调用它就行,括号中的元素就是你要求均值的对象。R中包含了...初学R语言学习R语言,肯定要清楚它能干嘛,它的作用就是把常见的统计方法封装起来了,直接调用起来就非常简单了。比如means(obeject),这就是一个求均值的方法,直接调用它就行,括号中的元素就是你要求均值的对象。R中包含了基本上所有的数学上的算法,通过它我们能直接得到我们的答案。第一步,导入数据(想要使用R,你必须把数据导入进去)read.table(file="%.txt",header=T)以上就是读入数据的命令,read.table(),file就是文件的目录加文件名(不过我习惯把工作路径直接设在当前文件目录中),header就是说第一行是不是列标识,T就是TRUE,F就是FALSE。a<-read.table(file="lm1.txt",header=F)
getwd()就是获得工作路径,把lm1.txt文件放在工作目录下,就把文件读入对象a了。第二步,导出数据write.table(object,file="export.txt")把object文件导出在当前工作目录下,并命名为export.txt。第三步,R中有哪些数据类型向量(vector)c(1,2,3)因子(factor)factor(x)
矩阵(matrix)matrix(x,ncol=2)
数据框(data.frame)data.frame(x)
列表(list)list(x)
以上这几种数据框架我们做统计经常需要接触,大家一定要熟悉掌握。到这里我们就结束了第一章 -
python输出函数加上r和f的作用:即print(r“ “)或者print(f“ “)
2020-08-11 15:07:17r就是保持字符串原始值的意思,在我们输入路径的时候,总会出现斜杠“\”,这个符号在python语言中具有转义的作用,加上r就是避免转义,直接原文输出。 2.python输出函数加上f的作用:即print(f" ") 主要作用就是...1.python输出函数加上r的作用:即print(r" ")
主要的原因是为防止转义,保证r后面的内容全文输出。
r就是保持字符串原始值的意思,在我们输入路径的时候,总会出现斜杠“\”,这个符号在python语言中具有转义的作用,加上r就是避免转义,直接原文输出。
2.python输出函数加上f的作用:即print(f" ")
主要作用就是格式化字符串,加上f以后,{"变量/表达式"},花括号里的变量和表达式就可以使用了。
举个例子,体会一下:
for i in range(9):
print(f"本次循环输出值的平方为:{i*i}")
希望对看到的人有帮助,
###因为相信,所以美好###
我们都不孤单,一起努力*_*
加油@_@,
-
R语言 查看已加载包、卸除加载包及安装包与卸载包
2018-07-16 16:53:31在R语言中,常需要看哪个包加载了或是看多个相似功能的包,看到底是哪个包在起作用,通过加载和卸除后进行运行比较分析。 1、查看已加载的包 >(.packages()) 注意外面的括号和前面的点不能省。 2、卸除已加载... -
R语言-查看加载包、卸除加载包及安装包与卸载包
2015-11-11 13:01:12在R语言中,常需要看哪个包加载了或是看多个相似功能的包,看到底是哪个包在起作用,通过加载和卸除后进行运行比较分析。 1、查看已加载的包 >(.packages()) 注意外面的括号和前面的点不能省。 2、卸除已加载的包 如... -
-
Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册
2009-04-28 16:43:18在面向对象的语言中,类的功能更强大,这是因为类不仅 含有定义数据类型的功能,而且还包含了对方法的定义。 对象实际是类中的一个实例。生成实例的过程叫做把"一个对象实例化"。一个实例化 的对象实际上是由若干个... -
C 语言编程常见问题解答.chm
2012-09-24 12:35:3914 取模运算符(modulusoperator)“%”的作用是什么? 第2章 变量和数据存储 2. 1 变量存储在内存(memory)中的什么地方? 2. 2 变量必须初始化吗? 2. 3 什么是页抖动(pagethrashing)? 2. 4 什么是const... -
你必须知道的495个C语言问题(中文高清版)
2013-03-20 13:28:283.5 可否用显式括号来强制执行我所需要的计算顺序并控制相关的副作用?就算括号不行,操作符优先级是否能够控制计算顺序呢? 3.6 可是&&和||操作符呢?我看到过类似while((c=getchar())!=EOF&&c!='\n')的代码... -
-
你必须知道的495个C语言问题
2015-05-08 11:09:253.5 可否用显式括号来强制执行我所需要的计算顺序并控制相关的副作用?就算括号不行,操作符优先级是否能够控制计算顺序呢? 3.6 可是&&和||操作符呢?我看到过类似while((c=getchar())!=EOF&&c!='\n')的代码……... -
Python核心编程第二版(中文)
2015-04-23 16:40:131.7 比较Python(Python与其他语言的比较) 1.8 其他实现 1.9 练习 第2章 快速入门 2.1 程序输出,print语句及“Hello World!” 2.2 程序输入和raw_input()内建函数 2.3 注释 2.4 操作符 2.5 变量和赋值... -
《你必须知道的495个C语言问题》
2010-03-20 16:41:183.5 可否用显式括号来强制执行我所需要的计算顺序并控制相关的副作用?就算括号不行,操作符优先级是否能够控制计算顺序呢? 35 3.6 可是&&和||操作符呢?我看到过类似while((c = getchar()) != EOF && c != '\... -
Delphi6开发人员指南-正文1
2011-04-11 10:51:21赋值”运算符\r\n2.6 Object Pascal类型\r\n2.6.1 类型比较\r\n2.6.2 字符类型\r\n2.6.3 字符串\r\n2.6.4 变体类型\r\n2.6.5 货币类型\r\n2.7 用户自定义类型\r\n2.7.1 数组\r\n2.7.2 动态数组\r\n2.7.3 记录\r\n... -
Delphi6 开发人员指南封面目录
2011-04-11 10:48:01赋值”运算符\r\n2.6 Object Pascal类型\r\n2.6.1 类型比较\r\n2.6.2 字符类型\r\n2.6.3 字符串\r\n2.6.4 变体类型\r\n2.6.5 货币类型\r\n2.7 用户自定义类型\r\n2.7.1 数组\r\n2.7.2 动态数组\r\n2.7.3 记录\r\n... -
Python核心编程(中文第二版)
2009-10-02 12:08:141.7 比较Python(Python与其他语言的比较) 1.8 其他实现 1.9 练习 第2章 快速入门 2.1 程序输出,print语句及“Hello World!” 2.2 程序输入和raw_input()内建函数 2.3 注释 ... -
你必须知道的495个C语言问题(高清版)
2010-03-31 16:24:093.5 可否用显式括号来强制执行我所需要的计算顺序并控制相关的副作用?就算括号不行,操作符优先级是否能够控制计算顺序呢? 35 3.6 可是&&和||操作符呢?我看到过类似while((c = getchar()) != EOF && c != '\... -
-
-
你必须知道的495个C语言问题.[美]Steve Summit(带详细书签).pdf 压缩版
2018-04-08 02:26:503.5 可否用显式括号来强制执行我所需要的计算顺序并控制相关的副作用?就算括号不行,操作符优先级是否能够控制计算顺序呢? 64 3.6 可是&&和||操作符呢?我看到过类似while((c = getchar()) != EOF && c != '\n')... -
你必须知道的495个C语言问题.[美]Steve Summit(带详细书签).pdf 高清版
2018-04-08 01:22:393.5 可否用显式括号来强制执行我所需要的计算顺序并控制相关的副作用?就算括号不行,操作符优先级是否能够控制计算顺序呢? 64 3.6 可是&&和||操作符呢?我看到过类似while((c = getchar()) != EOF && c != '\n')... -
[你必须知道的495个C语言问题]人民邮电出版社
2012-08-18 19:02:283.5 可否用显式括号来强制执行我所需要的计算顺序并控制相关的副作用?就算括号不行,操作符优先级是否能够控制计算顺序呢? 3.6 可是&&和||操作符呢?我看到过类似while((c=getchar())!=EOF&&c!='\n')的代码... -
LINGO软件的学习
2009-08-08 22:36:50LINGO内置的建模语言是一种描述性语言,用它可以描述现实世界中的一些问题,然后再借助于LINGO求解器求解。因此,集属性的值一旦在模型中被确定,就不可能再更改。在LINGO中,只有在初始部分中给出的集属性值在以后... -
你必须知道的495个C语言问题.pdf
2013-01-20 14:30:543.5 可否用显式括号来强制执行我所需要的计算顺序并控制相关的副作用?就算括号不行,操作符优先级是否能够控制计算顺序呢? 3.6 可是&&和||操作符呢?我看到过类似while((c = getchar()) != EOF && c != '\n')的... -
[你必须知道的495个C语言问题]人民邮电出版社.扫描版.pdf
2011-10-01 21:39:523.5 可否用显式括号来强制执行我所需要的计算顺序并控制相关的副作用?就算括号不行,操作符优先级是否能够控制计算顺序呢? 3.6 可是&&和||操作符呢?我看到过类似while((c = getchar()) != EOF && c != '\n')的...