R学习:环境和函数

R语言学习贴往期回顾

R学习:R for Data Science(一)

R学习:R for Data Science(二)

R学习:R for Data Science(三)

R学习:R for Data Science(四)

R学习:R for Data Science(五)

R学习:数据框的基本操作

今天我们了解一下环境和函数

环境和函数

阅读本章后, 你会了解以下内容: · 环境是什么, 如何创建它; · 如何创建、 访问和列出环境内的变量; · 函数的各个组成部分; · 编写自己的函数; · 变量的作用域。

环境的创建是使用 new.env 函数:

an_environment<-new.env()

向环境中分配变量的方式与列表完全相同。可以使用双方括号或美元符号运算符。和列表一样, 环境变量的类型和大小可以不同

an_environment<-new.env()an_environment[["pythag"]]<-c(12, 15, 20, 21)an_environment$root<-polyroot(c(6, -5, 1))

assign 函数可以指定变量的存储位置

assign( "moonday", weekdays(as.Date("1969/07/20")), an_environment)

检索变量的方式也是如此:可以使用列表的索引语法,或 assign 的对立函数 get:

an_environment[["pythag"]]## [1] 12 15 20 21an_environment$root## [1] 2+0i 3-0iget("moonday", an_environment)## [1] "星期日"

可以把环境参数传入 ls 和 ls.str 函数中, 列出它的所有内容

ls(envir = an_environment)## [1] "moonday" "pythag" "root"ls.str(envir = an_environment)## moonday: chr "Sunday"## pythag: num [1:4] 12 15 20 21## root: cplx [1:2] 2+0i 3-0i

可用 exists 函数测试变量是否在环境中:

exists("pythag", an_environment)## [1] TRUE

使用 as.list 和 as. environment 函数能分别实现从环境到列表或相反过程的转换。在后一种情况中, 还可以使用 list2env 函数, 它在创建环境时更为灵活:

# 转换为列表(a_list<-as.list(an_environment))## $pythag## [1] 12 15 20 21#### $moonday## [1] "Sunday"#### $root## [1] 2+0i 3-0i
# 再转换回来。以下两行代码的效果一样。as.environment(a_list)## <environment: 0x000000004a6fe290>list2env(a_list)## <environment: 0x000000004ad10288>

函数

大多数的变量类型仅用于存储数据, 而函数能够让我们和数据一起工作, 它们是“动词”而非“名词”。和环境类似, 它们只是另一种数据类型, 我们可以分配、 操纵, 甚至将它传递给其他函数的数据类型。

创建和调用函数

键入一个函数的名称,将显示其运行的代码。以下是 rt 函数, 该函数将生成基于 T 分布的随机数

rt## function (n, df, ncp)## {## if (missing(ncp))## .External(C_rt, n, df)## else rnorm(n, ncp)/sqrt(rchisq(n, df)/df)## }## <bytecode: 0x0000000019738e10>## <environment: namespace:stats>

rt 需要三个输入参数:n 是要产生的随机数的数目, df 是自由度值, ncp 是一个可选的非中心参数。从技术上来说, 三个参数 n、 df 和 ncp 是 rt 函数的形式参数(formal argument)。当你调用该函数并给它传递值时, 这些值被称为参数。

在大括号之间, 你可以看到函数体内代码行。它们就是每次调用 rt 时要执行的代码

在 R 中, 函数中计算的最后一个值将自动返回。以 rt 为例, 如果 ncp 参数被省略,将会调用C 代码生成随机数并返回。否则,该函数会调用 rnorm、 rchisq 和 sqrt 函数计算并返回值。

要创建我们自己的函数,只需像其他任何变量一样为它赋值。举一个例子, 创建一个函数来计算直角三角形斜边的长度

hypotenuse <- function(x, y){ sqrt(x ^ 2 + y ^ 2)}

这里, hypotenuse 是我们正在创建的函数, x 和 y 是它的参数(形参), 在大括号中的内容是函数体

现在, 可以使用以下任意一种方式来调用这个函数:

hypotenuse(3, 4)## [1] 5hypotenuse(y = 24, x = 7)## [1] 25

当我们调用函数时, 如果不命名参数, 则 R 将按位置匹配它们。以 hypotenuse(3, 4) 为例:3 是第一个参数, 因此它对应 x;4 是第二个参数, 因此它对应 y。

以下新版本的代码中, 如果我们不给函数传递任何值, 则 x 会取默认值 5, 而 y 会取 12:

hypotenuse <- function(x = 5, y = 12){ sqrt(x ^ 2 + y ^ 2)} hhypotenuse() # 与 hypotenuse(5, 12) 相等

向其他函数传递和接收函数
函数可以像其他变量类型一样地使用,我们可将之作为其他函数的参数, 并且从函数中返回。一个常见的, 把其他函数当成参数的例子是 do.call。此函数提供了一种调用其他函数的替代语法,让我们可以像列表一样传递参数, 而不是逐次传递:

do.call(hypotenuse, list(x = 3, y = 4)) # 和 hypotenuse(3, 4) 一样## [1] 5

常见的案例为 do.call 与 rbind 混用。你可以结合这两个函数, 你可以一次拼接多个数据框或矩阵:

dfr1 <- data.frame(x = 1:5, y = rt(5, 1))dfr2 <- data.frame(x = 6:10, y = rf(5, 1, 1))dfr3 <- data.frame(x = 11:15, y = rbeta(5, 1, 1))do.call(rbind, list(dfr1, dfr2, dfr3)) # 和 rbind(dfr1, dfr2, dfr3) 一样

我们还可以以匿名方式传递函数 :

x_plus_y <- function(x, y) x + ydo.call(x_plus_y, list(1:5, 5:1))## [1] 6 6 6 6 6
# 与下相同do.call(function(x, y) x + y, list(1:5, 5:1))## [1] 6 6 6 6 6

小结
· 环境能存储变量, 它能够被 new.env 函数创建。
· 通常, 你可以把环境看作列表。
· 函数由形参和函数体组成。
· 你可以分配和使用函数, 像对任何其他的变量类型一样。

(0)

相关推荐

  • SAP Spartacus 如何借助env-cmd 实现 B2B 和 B2C 功能启动的无缝切换

    在之前的 SAP Spartacus 标准开发中,每次我从 Github 上 clone 了最新的代码后,必须手动修改 environment.ts 里的配置值,将 CX_BASE_URL 和 b2b ...

  • Anconda安装

    我本来也不想写这个文章的,只不过是这次换了新系统很多配置都没有用了...一败涂地哇.我现在什么也干不了,人生大好时间配了环境... 不比比了,开搞! 先下载anconda,去清华源.看着点自己是什么型 ...

  • PHP中环境变量的操作

    PHP中环境变量的操作 在 PHP 中,我们可以通过 phpinfo() 查看到当前系统中的环境变量信息(Environment).在代码中,我们也可以通过两个函数,查看和修改相应的环境变量信息. g ...

  • postman使用教程10-请求前参数预处理(pre-request)

    前言 接口测试的时候,有些参数并不是固定的,需动态处理下,比如前面讲的注册时候在字符串后面加时间戳,可以通过动态变量来生成. 有些复杂的参数处理,如果系统没提过对于的动态变量,我们可以自己写个请求前参 ...

  • R语言with/within函数添加数据框到环境变量

    欢迎来到医科研,这里是白介素2的读书笔记,跟我一起聊临床与科研的故事, 生物医学数据挖掘,R语言,TCGA.GEO数据挖掘. R语言中的with/within函数  介绍一个神操作 如何把数据框或列表 ...

  • 学习R语言:CATT()函数实现趋势性卡方检验

    学习一个Cochran-Armitage趋势性检验(CATT).上一篇文章已经可以录入一个交叉表table的数据. 回顾: 学习R:matrix()函数录入矩阵数据 已知某地区的某一人群2011-20 ...

  • R学习:R for Data Science(七)函数

    R学习往期回顾: R学习:R for Data Science(六)使用forcats处理因子 R学习 从Tidyverse学起,入门R语言 dplyr合并数据 R学习 流程控制 if,else,if ...

  • R学习:paste/paste0函数

    之前我们介绍过字符串的简单处理: R学习 从Tidyverse学起,入门R语言(tidyr和stringr) 其中的stringr包可以花式处理字符串,而paste/paste0函数也可以轻易的实现字 ...

  • R学习:R for Data Science 循环-迭代 purrr 函数代替 for 循环

    R学习往期回顾: R学习:R for Data Science 循环-迭代(for while)) R学习:R for Data Science 向量(1) R学习:R for Data Scienc ...

  • 重新设计学习和教学空间:设计利于活动/游戏/学习/创造的学习环境

    序言 引言 从过去到未来 教育面向未来 通过设计提升学习 教育工作者和学生的声音 本书的结构特点 活动.游戏.学习与创造融为一体 本书的基本理念 本书是如何撰写出来的 第一部分 设计利于活动.游戏.学 ...

  • 老曹眼中的开发学习环境

    "工其事必先利其器",对于一个全栈而言,一个与自己匹配的开发和学习环境,能够极大地提高个人的工作效率,很多时候都可以做到事半而功倍.环境也是一个外延很广的概念,这里我所涉及的包括硬 ...

  • 警惕!高焦虑养育者、高焦虑学习环境、高竞争同伴关系……当下青少年“弱现实感”的十大成因

    弱现实感是指在现实生活中难以体会到意义感,个人度过的时光是被安排好了的,久之无主动寻求自主生活内容的需求,整个生活处于被动状态,在虚拟世界里得到情感体验,不会也不能处理现实事务的当下都市青少年的一种存 ...

  • 努力创设舒心的学习环境

    努力创设舒心的学习环境  华龙区岳村寨小学     曹运英 每次来到市里培训学习,我都格外留意市里学校的校园环境和教室环境.因为总想着从内外因相结合的方法,让我的学生乐学好学. 2017年冬天,我和朋 ...