找回密码
 注册
查看: 21459|回复: 0

如何用R语言编写一些自己的函数

[复制链接]
发表于 2011-1-22 18:50:09 | 显示全部楼层 |阅读模式
大多数R的工作是通过函数来实现, 而且这些函数的输入参数都放在一个
括弧里面. 用户可以编写他们自己的函数, 并且这些函数和R里面的其他函数
有一样的特性.
编写自己的函数可以让你有效的,灵活的与合理的使用R. 我们再次使用前
面读数据并且画图的例子. 如果我们想在其他情况下进行这样的操作, 写一个
函数是一个不错的想法:
myfun <- function(S, F) {
data <- read.table(F)
plot(data$V1, data$V2, type="l")
title(S)
}
执行时, 这个函数必须载入内存.当然, 这有多种方式实现. 和所有其他
命令一样, 函数的各行可以直接通过键盘键入,或者从一个文本编辑器里面拷
贝粘贴.如果函数保存在一个文本文件中, 可以命令source() 载入. 如果用
户期望一些函数在R启动时就被载入, 可以把它们保存在工作目录下面的文
件.RData中. 另外一种方式是, 配置文件`.Rpro&macr;le' 或`Rpro&macr;le' (详见?Startup
for details). 最后, 还可以创建一个包, 但是这里不想多讨论(见手册\编写R扩
展").
一旦函数载入后, 我们就可以键入一条命令以读入数据和画出我们想要的
图, 如myfun("swallow", "Swal.dat"). 因此, 现在我们的程序有第三个实现
的版本了:
layout(matrix(1:3, 3, 1))
myfun("swallow", "Swal.dat")
myfun("wren", "Wrenn.dat")
myfun("dunnock", "Dunn.dat")
我们还可以用sapply() 实现程序的第四个版本:
layout(matrix(1:3, 3, 1))
species <- c("swallow", "wren", "dunnock")
file <- c("Swal.dat" , "Wren.dat", "Dunn.dat")
sapply(species, myfun, file)
在R里面, 没有必要在一个函数里面进行变量声明. 当一个函数执行时,
R用一种称为词汇作用域(lexical scoping)的规则决定一个对象的作用域相对
一个函数是局部还是全局.为了理解这种机制, 我们可以认真研究一下下面的
一个简单函数:
> foo <- function() print(x)
> x <- 1
> foo()
[1] 1
x 不是为了在函数foo()里面创建对象, 因此R 将会在封装环境中搜索是
否有个名为x 的对象, 和打印它的值(否则一条错误信息将会显示, 执行中断).
如果x是我们定义的函数中一个对象的名字, 全局环境中变量x 值将会被
采用.
> x <- 1
> foo2 <- function() { x <- 2; print(x) }
> foo2()
[1] 2
> x
[1] 1
此时, print() 使用在它所在的环境中定义的x, 即环境foo2 中的x.
前面提及的\封装"是关键所在.在前面两个演示函数中, 有两个环境: 全局
环境和函数foo 或foo2的局部环境. 如果有三个或者更多的嵌套环境, 对象搜
索将逐层搜索直到全局环境.
有两种方式指定一个函数的参数: 通过它们的定义时的位置或者名字(又
称为标签参数). 例如, 假定一个函数有三个参数:
foo <- function(arg1, arg2, arg3) {...}
foo() 在执行时可以不用名字arg1, . . . , 如果相应的参数对象放在相应的
位置上, 如: foo(x, y, z). 但是, 如果使用了参数的名字, 位置信息将会失效,
如foo(arg3 = z, arg2 = y, arg1 = x). R函数的另外一个特性是函数可能
采用定义时的默认设置. 例如:
foo <- function(arg1, arg2 = 5, arg3 = FALSE) {...}
命令foo(x), foo(x, 5, FALSE) 和foo(x, arg3 = FALSE) 将会得到一样的
结果. 使用一个函数的默认设置非常有用, 特别在使用标签参数的时候,
如foo(x, arg3 = TRUE) 仅仅改变一个默认设置.

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|小黑屋|生物统计家园 网站价格

GMT+8, 2024-11-22 02:33 , Processed in 0.082380 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表