02 2019 档案

摘要:Python中下划线 完全解读 Python 用下划线作为变量前缀和后缀指定特殊变量 _xxx 不能用’from module import *’导入 __xxx__ 系统定义名字 __xxx 类中的私有变量名 核心风格:避免用下划线作为变量名的开始。 因为下划线对解释器有特殊的意义,而且是内建标识 阅读全文
posted @ 2019-02-26 17:26 NAVYSUMMER 阅读(6001) 评论(0) 推荐(0)
摘要:在上一章中,我们掌握了使用 R 从网页中提取信息。为了理解网页爬虫的运行机理,我们学习了几种语言,如HTML、CSS 和XPath。事实上,R 提供的不仅仅是统计计算环境。R 社区还提供数据收集、数据操作、统计建模、可视化,以及报告和演示等一切可能涉及到的工具。本章将介绍一些提高生产力的扩展包。先回 阅读全文
posted @ 2019-02-11 15:11 NAVYSUMMER 阅读(138) 评论(0) 推荐(0)
摘要:上一节演示了 R Markdown 的部分功能,它是为创建动态文档而设计的。本节将快速 介绍如何创建交互式应用程序,使用图形用户界面与数据进行交互。 创建 shiny 应用程序 使用 shinydashboard 阅读全文
posted @ 2019-02-11 15:10 NAVYSUMMER 阅读(247) 评论(0) 推荐(0)
摘要:除了 shiny 扩展包提供的函数之外,RStudio 也开发了一个 shinydashboard 扩展包 (http://rstudio.github.io/shinydashboard/),它呈现数据的方式就是专门用于概览或监测数据。接下来的例子旨在说明创建一个简易仪表板有多简单,这个仪表板可以 阅读全文
posted @ 2019-02-11 15:09 NAVYSUMMER 阅读(466) 评论(0) 推荐(0)
摘要:R 本身是一个优秀的数据分析和数据可视化平台。然而,我们通常不会将 R 和分析脚本提供给客户,让客户自己运行。数据分析的结果不仅可以在 HTML 网页、PDF 文档或 Word 文档中显示,还可以呈现在交互式应用中,这种应用允许用户与数据进行交互,用户可以修改某些参数并查看结果如何发生变化。由 RS 阅读全文
posted @ 2019-02-11 15:06 NAVYSUMMER 阅读(483) 评论(0) 推荐(0)
摘要:数据分析师的工作不仅是将数据放入模型并得出一些结论。通常需要完成从数据收集、数据清理、可视化、建模再到最后编写报告或制作演示文稿的完整工作流程。在前面几章中,我们从不同方面深入学习 R 编程语言,从各个环节,一步一步提升生产效率。在本章中,我们将关注最后一步:报告和展示。在以下内容中,我们将学习一种 阅读全文
posted @ 2019-02-11 15:04 NAVYSUMMER 阅读(377) 评论(0) 推荐(0)
摘要:如果没有 R 代码块,R Markdown 与普通的 markdown 文档没有什么区别。使用代码块,代码的输出便可以嵌入到文档中,动态生成最终结果。如果代码块使用的是随机数生成器而没有设定随机数种子,那么每次渲染文档,都将得到不同的结果。在默认情况下,代码块的输出直接放在代码下面,以##开头,固定 阅读全文
posted @ 2019-02-11 15:03 NAVYSUMMER 阅读(751) 评论(0) 推荐(0)
摘要:markdown 易于写入和读取,具有编写报告的必要功能,例如简单的文本格式,嵌入图片、链接、表、引用、数学公式以及代码块。虽然在 markdown 中编写纯文本很容易,但是创建具有许多图片和表格的报告却不是很容易,特别是当图和表是由代码动态生成的时候。R Markdown 是将 R 整合到 mar 阅读全文
posted @ 2019-02-11 14:59 NAVYSUMMER 阅读(429) 评论(0) 推荐(0)
摘要:R 是统计计算和数据分析的利器。给定一个数据集,利用前几章介绍到的 R 中灵活的数据结构或高性能计算,我们可以很方便地进行数据转换、建模和数值分析。一般来说,商业数据库会将数据以表格的形式很好地组织起来,便于使用。然而,情况并非总是如此合意,输入数据集也并非总是立即可得。有时,我们需要自己收集数据。 阅读全文
posted @ 2019-02-11 14:53 NAVYSUMMER 阅读(515) 评论(0) 推荐(0)
摘要:在前面的内容中,我们已经学习了 HTML、CSS 和 XPath 的基础知识。从真实世界的网页中获取数据,关键在于如何编写合适的 CSS 或者 XPath 选择器。本节介绍一些确定选择器的简单方法。假设从https://cran.rstudio.com/web/packages/available_ 阅读全文
posted @ 2019-02-11 14:52 NAVYSUMMER 阅读(2816) 评论(0) 推荐(0)
摘要:在前面的内容中,我们掌握了一些 CSS 选择器和它们的使用方法,以及 rvest 包中用于提取网页内容的函数。一般来说,CSS 选择器足够满足绝大部分的 HTML 节点匹配的需要。但是,当需要根据某些特殊条件选择节点时,需要用更强大的技术。图 14-5 所示的网页比 data/products.ht 阅读全文
posted @ 2019-02-11 14:47 NAVYSUMMER 阅读(217) 评论(0) 推荐(0)
摘要:在 R 中,关于网络爬虫最简单易用的扩展包是 rvest。运行以下代码从 CRAN 上安装:install.packages("rvest")首先,加载包并用 read_html( ) 读取 data/single-table.html,再尝试从网页中提取表格:library(rvest)## Lo 阅读全文
posted @ 2019-02-11 14:46 NAVYSUMMER 阅读(894) 评论(0) 推荐(0)
摘要:信息展示在网页上。图 14-1 展示了一个简单的网页(网址为 data/simple-page.html),包括标题和一个段落:所有现代浏览器都支持这样的网页。用任意的文本编辑器打开 data/simple-page.html,就会看到网页背后的代码,如下所示:<!DOCTYPE html><htm 阅读全文
posted @ 2019-02-11 14:44 NAVYSUMMER 阅读(401) 评论(0) 推荐(0)
摘要:在前一章中,我们学习了许多内置函数以及为数据操作量身定制的扩展包。虽然这些包依赖于不同的技术,设计初衷也有所不同,但它们都在很大程度上简化了数据筛选和聚合的步骤。然而,数据处理不仅仅是简单的筛选和聚合,有时还涉及模拟和其他计算密集型任务。R 比 C 和 C++ 这些高性能编程语言要慢很多,这是因为 阅读全文
posted @ 2019-02-11 14:40 NAVYSUMMER 阅读(205) 评论(0) 推荐(0)
摘要:在上一节中,我们演示了如何使用分析工具找出代码中的“性能瓶颈”。本节将学习一些提高代码性能的方法。 使用内置函数 使用向量化 使用字节码编译器 使用由 Intel MKL 支持的 R 使用并行计算 使用 Rcpp 阅读全文
posted @ 2019-02-11 14:39 NAVYSUMMER 阅读(114) 评论(0) 推荐(0)
摘要:正如我们所提到的那样,并行计算只有在每次迭代都是独立的情况下才可行,这样最终结果才不会依赖运行顺序。然而,并非所有任务都像这样理想。因此,并行计算可能会受到影响。那么怎样才能使算法快速运行,并且可以轻松地与 R 实现交互呢?答案是通过 Rcpp 用 C++ 语言编写算法(http://www.rcp 阅读全文
posted @ 2019-02-11 14:38 NAVYSUMMER 阅读(1070) 评论(0) 推荐(0)
摘要:正如我们在上一节提到的,R 是被设计成单线程的,但它仍然可以使用多线程并行计算,即运行多个 R 会话进行计算。该技术是由一个随 R 一起发布的并行库来支持的。假设我们需要做一次模拟:生成一个遵循特定随机过程的随机路径,看看在任何一点是否有值超出了起点的一个固定邻域。以下代码是一种实现:set.see 阅读全文
posted @ 2019-02-11 14:35 NAVYSUMMER 阅读(396) 评论(0) 推荐(0)
摘要:我们通常使用的 R 版本是单线程的,即只使用一个 CPU 线程运行所有 R 代码。这样的好处是运行模型比较简单且安全,但是它并没有利用多核计算。Microsoft R Open(MRO,https://mran.microsoft.com/open/)是 R 的一个增强版本。由 IntelMath 阅读全文
posted @ 2019-02-11 14:33 NAVYSUMMER 阅读(471) 评论(0) 推荐(0)
摘要:在上一节中,我们介绍了向量化的强大之处。然而,有时候难以使用向量化解决某些问题,必须使用 for 循环。在这种情况下,我们可以考虑使用字节代码编译器来编译函数,就不需要对函数进行解析,运行速度也会更快。首先,我们加载编译器的包,它是随 R 一起发布的。使用 cmpfun( ) 函数编译一个给定的 R 阅读全文
posted @ 2019-02-11 14:32 NAVYSUMMER 阅读(196) 评论(0) 推荐(0)
摘要:算术运算符是一些特殊的内置函数,诸如 +、-、*、/、^ 和 %%。这些运算符不仅高效,还是向量化的。比如在 R 中完成一个 + 的实现:add <- function(x, y) {stopifnot(length(x) == length(y),is.numeric(x), is.numeric 阅读全文
posted @ 2019-02-11 14:31 NAVYSUMMER 阅读(129) 评论(0) 推荐(0)
摘要:前面,我们演示了 my_cumsum1( )、my_cumsum2( ) 和内置函数 cumsum( ) 之间的性能差异。尽管 my_cumsum2( ) 比 my_cumsum1( ) 快,但是当输入向量的数据量很大时,cumsum( ) 要比它们都快很多。而且,随着输入向量数据量的增加,cums 阅读全文
posted @ 2019-02-11 14:29 NAVYSUMMER 阅读(159) 评论(0) 推荐(0)
摘要:在前面的内容中,我们学习了测试代码时间和分析代码性能的工具。为了解决同样的问题,某个函数可能非常快,而另一个函数可能会很慢。理解代码为什么会慢,对编程是很有帮助的。首先,R 是一个动态编程语言。它本身提供了非常灵活的数据结构和代码运行机制。因此,在函数被调用之前,代码解释器很难提前知道如何处理调用。 阅读全文
posted @ 2019-02-11 14:27 NAVYSUMMER 阅读(278) 评论(0) 推荐(0)
摘要:在上一节中,我们学习了如何使用 microbenchmark( ) 对表达式进行基准测试。当一个问题有多种解法时,我们就会想知道哪一个的性能更好;或者在优化一个表达式时,想看它的性能是否比原始代码更好,这时 microbenchmark( ) 就能派上用场了。然而,通常情况下,当感觉到代码很慢时,想 阅读全文
posted @ 2019-02-11 14:27 NAVYSUMMER 阅读(393) 评论(0) 推荐(0)
摘要:Rprof( ) 函数提供了有用的信息帮助我们找到代码瓶颈,进而提升代码性能。RStudio 也发布了一个增强版的分析工具 profvis( ),它还提供了用于分析 R 代码的交互式可视化功能(https://rstudio.github.io/profvis/)。它是一个 R 扩展包,已经集成到 阅读全文
posted @ 2019-02-11 14:26 NAVYSUMMER 阅读(732) 评论(0) 推荐(0)
摘要:R 提供了内置函数 Rprof( ) 对代码的性能进行分析。在分析过程中,会有一个抽样程序,并且是和后续代码一起运行的,直到分析结束。默认情况下,抽样程序基本上每隔20 毫秒就会记录一下当前 R 在运行哪个函数。这样,如果某个函数运行得很慢,那么很可能大部分时间都在调用这个函数。这种抽样方法可能不会 阅读全文
posted @ 2019-02-11 14:24 NAVYSUMMER 阅读(495) 评论(0) 推荐(0)
摘要:输入相同,3 个函数的输出结果也相同。尽管如此,它们的性能差异还是很明显。为了揭示性能差异,我们需要一些工具来测试每段代码的运行时间。最简单的便是system.time( ) 函数。测试任意表达式的运行时间,只需将代码封装在函数内。这里,我们测试 my_cumsum1( ) 函数计算包含 100 个 阅读全文
posted @ 2019-02-11 14:22 NAVYSUMMER 阅读(473) 评论(0) 推荐(0)
摘要:在诞生之初,R 就是为统计计算和数据可视化而设计的,并且被学界和业界广泛运用。就大多数数据分析的目的而言,正确性比性能更重要。换句话说,在 1 分钟内得到正确的结果比在 20 秒内获得错误的结果要好。速度快 3 倍的结果并不比速度慢但正确的结果好 3倍。因此,在确认自己的代码正确之前先不必考虑性能的 阅读全文
posted @ 2019-02-11 14:20 NAVYSUMMER 阅读(209) 评论(0) 推荐(0)
摘要:在前面的章节中,我们已经学习了存储表的关系型数据库,支持嵌套数据结构的非关系型数据库。在 R 中,最常见的嵌套数据结构就是列表对象。之前的章节都关注操作表格数据。本节,我们一起玩转作者开发的 rlist 包,这是一个为操作非表格数据设计的包。rlist 的设计和 dplyr 非常相似。它提供了针对列 阅读全文
posted @ 2019-02-11 14:16 NAVYSUMMER 阅读(582) 评论(0) 推荐(0)
摘要:在前面的章节中,我们已经学习了连接不同类型数据库的方法,包括关系型数据库(SQLite 和 MySQL)和非关系型数据库(MongoDB 和 Redis)。关系型数据库通常以表格形式返回结果,非关系型数据库则可能支持嵌套数据结构和其他特性。通常来说,即使数据已经被载入内存中,我们为数据分析所做的准备 阅读全文
posted @ 2019-02-11 14:16 NAVYSUMMER 阅读(136) 评论(0) 推荐(0)
摘要:关于数据操作的另一个流行的包是dplyr,它发明了一种数据操作语法。dplyr 扩展包并没有使用构建子集函数([ ]),而是定义了一系列基础的变形函数作为数据操作模块,并且引入了一个管道操作符,利用管道操作符将这些变形函数串联起来,进而完成复杂的多步任务。如果还没有安装 dplyr,请运行以下代码以 阅读全文
posted @ 2019-02-11 14:14 NAVYSUMMER 阅读(572) 评论(0) 推荐(0)
摘要:在第一节中,我们回顾了许多用于操作数据框的内置函数。然后,了解了 sqldf 扩展包,它使得简单的数据查询和统计变得更简便。然而,两种方法都有各自的局限性。使用内置函数可能既繁琐又缓慢,而相对于各式各样的 R 函数来说,SQL 又不够强大,所以用 sqldf 进行数据的汇总统计,也不容易。data. 阅读全文
posted @ 2019-02-11 14:11 NAVYSUMMER 阅读(336) 评论(0) 推荐(0)
摘要:data.table 中最常用的语法就是 data[i, j, by],其中 i、j 和 by 都是在动态作用域中被计算的。换句话说,我们不仅可以直接使用列,也可以提前定义诸如 .N 、.I 和 .SD 来指代数据中的重要部分。演示之前,我们先创建一个新的 data.table ,并命名为 mark 阅读全文
posted @ 2019-02-11 14:10 NAVYSUMMER 阅读(178) 评论(0) 推荐(0)
摘要:使用 data.frame 时,改变列名或者排序,都会导致数据结构的复制。在最新版本的 R中,对列重命名已经很少复制了,但要实现完全不进行任何复制就能将某列重新排序,仍然很困难。当数据量较小的时候,还不是问题,如果数据非常大的话,这种操作对性能和内存造成的压力可能就比较麻烦了。作为 data.fra 阅读全文
posted @ 2019-02-11 14:08 NAVYSUMMER 阅读(156) 评论(0) 推荐(0)
摘要:在前面的章节中,我们已经学习了如何使用 reshape2 扩展包对 data.frame 进行塑形。其实,data.table 扩展包为 data.table 对象提供了更快更强的 dcast( ) 函数和 melt( ) 函数。例如,将 toy_tests 的每个产品的质量得分按照年和月进行对齐: 阅读全文
posted @ 2019-02-11 14:06 NAVYSUMMER 阅读(145) 评论(0) 推荐(0)
摘要:data.table 中另一个非常重要的参数是 by,它用于将数据分割成多个部分(即按照 by 的值进行分组),并且对每个部分(组)计算第 2 个参数。在本节中,我们将会演示如何通过 by 以更简便的方式实现数据的分组汇总。例如,by 的最简单用法就是计算每组的记录条数。在下面的代码中,我们将分别统 阅读全文
posted @ 2019-02-11 14:05 NAVYSUMMER 阅读(211) 评论(0) 推荐(0)
摘要:data.table 的另一个独特功能是它的索引支持,也就是说,我们可以在 data.table 中创建键(key),通过键获取记录极其高效。例如,使用 setkey( ) 将 id 设置为 product_info 中的一个键:setkey(product_info, id)注意到,这个函数的行为 阅读全文
posted @ 2019-02-11 14:03 NAVYSUMMER 阅读(101) 评论(0) 推荐(0)
摘要:在前面的章节中,我们学习了如何编写 SQL 语句,在关系型数据库(如 SQLite 和MySQL )中查询数据。我们可能会想,有没有一种方法,能够直接使用 SQL 进行数据框查询,就像数据框是关系型数据库中的表一样呢?sqldf 包给了我们肯定的答案。这个包吸收了 SQLite 的轻量结构和易于嵌入 阅读全文
posted @ 2019-02-11 14:00 NAVYSUMMER 阅读(532) 评论(0) 推荐(0)
摘要:我们已经学习了数据框的基础,这里回顾一下用于筛选数据框的内置函数。尽管数据框本质上是一个由向量构成的列表,由于各列长度相同,所以可以将其看作矩阵进行访问和操作。选择满足特定条件的行,需要为 [ ] 的第 1 个参数提供一个逻辑向量, 第 2 个参数留空。在 R 中,这些操作可以通过内置函数实现。本节 阅读全文
posted @ 2019-02-11 13:58 NAVYSUMMER 阅读(167) 评论(0) 推荐(0)
摘要:我们已经学习了如何筛选、排序、合并和汇总数据框。这些操作只适用于行和列,然而有时候我们需要做一些更复杂的事情。例如,下面这段代码读取了一个数据集,包含了两种产品不同日期的质量和耐久性的测试结果:toy_tests <- read_ _csv("data/product-toy-tests.csv") 阅读全文
posted @ 2019-02-11 13:57 NAVYSUMMER 阅读(210) 评论(0) 推荐(0)
摘要:接下来的例子中,我们会继续使用前面介绍过的产品信息样本和统计数据来演示数据筛选和统计的基本方法。例如,选取所有 type 为 toy 的行:product_info[product_info$type == "toy", ]## id name type class released## 1 T01 阅读全文
posted @ 2019-02-11 13:54 NAVYSUMMER 阅读(163) 评论(0) 推荐(0)
摘要:在前面的章节中,我们已经学习了面向对象编程的基本概念,包括类和方法,以及它们在 R 中是如何通过泛型函数执行方法分派而连接起来的。另外,也掌握了 S3、S4、RC和 R6 的基本用法,包括如何定义类和泛型函数,以及对特定的类实施相应的方法。在掌握了 R 的大部分重要特性之后,我们继续深入并探讨更实用 阅读全文
posted @ 2019-02-11 13:48 NAVYSUMMER 阅读(113) 评论(0) 推荐(0)
摘要:在本章的前几节中,我们已经掌握了关系型数据库的基础,学会使用 SQL 查询数据。关系型数据库主要是以表的形式组织,即它是相互之间具有关联的表的集合。然而,当数据量超出服务器的承载容量时,新问题就产生了,因为关系型数据库的传统模型不容易支持水平可伸缩性,即不再用单个服务器,而是用服务器群集中存储数据。 阅读全文
posted @ 2019-02-11 13:47 NAVYSUMMER 阅读(209) 评论(0) 推荐(0)
摘要:Redis(https://redis.io/),既不像 SQLite 以表的形式存储数据,也不像 MongoDB 允许以嵌套结构存储和查询,它是一种内存数据库结构,即将数据缓存在内存中。它将键—值(key-value)缓存于内存中,以此获得极高的键值检索性能。然而,它并不支持 SQL 数据库或 M 阅读全文
posted @ 2019-02-11 13:46 NAVYSUMMER 阅读(125) 评论(0) 推荐(0)
摘要:MongoDB 是一种流行的非关系型数据库,它提供了一种面向文档的数据存储方式。每种商品就是集合中的一份文档。商品具有一些描述字段和一个数组类型的评论字段。所有评论都是一个子文档,因此每个逻辑项都可以以自己的逻辑形式进行存储。以下是集合中一种商品的 JSON(https://en.wikipedia 阅读全文
posted @ 2019-02-11 13:42 NAVYSUMMER 阅读(126) 评论(0) 推荐(0)
摘要:在前面的章节中,我们使用一系列内置函数,例如 read.csv( ) 和 read.table( )从分隔符分隔的文件(例如 csv 格式)中读取数据。然而,当数据文件很大时,这些存储方式未必是最好的。为什么文本格式不再适用呢?主要有如下 3 个理由。1.read.csv( ) 这类函数主要用于将整 阅读全文
posted @ 2019-02-11 11:23 NAVYSUMMER 阅读(111) 评论(0) 推荐(0)
摘要:在处理大数据文件时,常常在读写数据方面遇到许多问题。实际可能出现两种极端情况。一种是文本格式的数据源非常大,几乎不能载入内存。另一种是:数据分散在许多文件中,需要费些力气将它们整合到一个数据框中。对于第 1 种情况,我们可以逐块地读取数据,并将每块数据分别追加到数据库的 某张表中。以下函数便是为此设 阅读全文
posted @ 2019-02-11 11:23 NAVYSUMMER 阅读(431) 评论(0) 推荐(0)
摘要:流行的关系数据库具有很强的确保一致性的能力。当我们插入或更新数据时,是通过事务实现的。其中事务是对数据库操作的逻辑单位,事务操作有两种:提交(将数据库所做的修改永久写入数据库)和回滚(将数据库所做的修改全部撤销,数据库还原到操作前的状态)。如果一个事务操作失败了,我们可以撤销并回滚,以保证数据的一致 阅读全文
posted @ 2019-02-11 11:21 NAVYSUMMER 阅读(179) 评论(0) 推荐(0)
摘要:在本节开始的部分,我们提到使用关系型数据库的优势之一,是可以存储大量数据。通常,我们只提取出数据库的一个子集进行研究。然而,有时,我们需要检查的数据量还是超过了计算机内存容量。显然不能把所有数据载入内存,所以必须逐块处理。绝大部分关系型数据库支持逐块提取查询。接下来的例子,我们用 dbSendQue 阅读全文
posted @ 2019-02-11 11:19 NAVYSUMMER 阅读(130) 评论(0) 推荐(0)
摘要:前面几节中,我们已经掌握了如何向 SQLite 数据库中写入数据。这一节,我们将学习如何根据需求对数据库进行查询,进而从中获取数据。接下来的例子中会使用 data/datasets.sqlite(之前创建的)。首先,需要与数据库建立连接:con <- dbConnect(SQLite( ), "da 阅读全文
posted @ 2019-02-11 11:18 NAVYSUMMER 阅读(673) 评论(0) 推荐(0)
摘要:一旦有了 SQLite 数据库,我们不仅可以访问存储于表中的数据,还可以访问一些元数据,倒如,所有表的名字或某个表的列。连接到之前创建的 SQLite 数据库,以便演示:con <- dbConnect(SQLite( ), "data/datasets.sqlite")调用 dbExistsTab 阅读全文
posted @ 2019-02-11 11:16 NAVYSUMMER 阅读(160) 评论(0) 推荐(0)
摘要:首先,我们学习如何创建一个SQLite 数据库。如果想要在data/example.sqlite 这个路径中创建一个示例数据库,就必须确保该路径存在。如果该路径不存在,就必须先创建路径:if (!dir.exists("data")) dir.create("data")现在,路径 data/ 是可 阅读全文
posted @ 2019-02-11 11:14 NAVYSUMMER 阅读(596) 评论(0) 推荐(0)
摘要:在前面的章节中,我们掌握了使用函数式编程和元编程技术来定制函数的行为。也可以用函数创建函数,就是所谓的闭包。还可以像传递其他对象一样,将函数传递给函数,即使用高阶函数。在本章中,我们将走进面向对象编程的世界,学习如何定制对象的行为。R 提供了几种不同的面向对象系统。乍一看,它们似乎与其他编程语言中的 阅读全文
posted @ 2019-02-11 11:12 NAVYSUMMER 阅读(110) 评论(0) 推荐(0)
摘要:RC 的加强版是 R6 , R6 是一个扩展包,能够实现支持公共和私有字段与方法的更有效的引用类,还有一些其他强大的功能。运行以下代码安装这个包:install.packages("R6")R6 类允许我们定义类,其行为特征更类似于流行的面向对象编程语言。我们用下面的代码定义了 Vehicle 类, 阅读全文
posted @ 2019-02-11 11:11 NAVYSUMMER 阅读(535) 评论(0) 推荐(0)
摘要:R 中还有一种具有引用语义的类系统,它更像其他面向对象编程语言中的类系统。首先,为了定义一个引用类( reference class , RC ),我们要给 setRefClass( )一个类定义。不像 S4 类系统使用 new( )创建一个对象实例,setRefClass( )会返回一个对象实例生 阅读全文
posted @ 2019-02-11 11:09 NAVYSUMMER 阅读(316) 评论(0) 推荐(0)
摘要:上一节中,我们介绍了 S3 系统。与大多数其他编程语言的面向对象系统不同,与那些类被定义为固定结构,且随着程序编译有确定的方法分派的系统相比,S3 系统显得非常不严谨。当我们定义一个 S3 类时,几乎没有可以确定的。我们不仅可以随时添加或移除类的方法,而且可以按需在对象中插入或删除元素。此外,S3 阅读全文
posted @ 2019-02-11 11:07 NAVYSUMMER 阅读(191) 评论(0) 推荐(0)
摘要:S4 泛型函数更加灵活,因为它也支持多重分派,也就是说,S4 泛型函数可以根据多个 参数执行方法分派。这里,我们定义另外一个 S4 类族:具有数值height 类表示的 Object 类。Cylinder和 Cone 都继承 Object。然后,我们使用多重分派计算底面具有特定形状的特定几何物体的体 阅读全文
posted @ 2019-02-11 11:05 NAVYSUMMER 阅读(163) 评论(0) 推荐(0)
摘要:在前面的例子中,我们可以看出 S4 比 S3 更正式,因为 S4 类有类的正式定义。同样, S4 的泛型函数也更加正式。在一个关于形状的例子中,我们定义了一系列具有继承关系的 S4 类,只是继承关系的层级结构比较简单。首先,Shape 是处于根节点的类,Polygon 和 Circle 都继承自 S 阅读全文
posted @ 2019-02-11 11:02 NAVYSUMMER 阅读(278) 评论(0) 推荐(0)
摘要:S3 系统是宽泛且灵活的,同类的 S3 对象也可能有不同的成员。但是,对于 S4 系统,就不会发生,也就是说,当我们创建一个属于某类的 S4 对象实例时,不能任意添加不在类表示中的字段。举个例子,在创建一个新的 Product 类的对象实例时,我们不能添加 volume 字段:bottle <- n 阅读全文
posted @ 2019-02-11 11:00 NAVYSUMMER 阅读(139) 评论(0) 推荐(0)
摘要:S3 类仅用一个字符向量表示,与之不同的是,S4 类要求对类和方法有正式定义。为了定义一个 S4 类,我们需要调用 setClass( ),并提供一种类成员的表示,这种表示被称为字段(slots)。通过名称和每个字段的类来指定这种表示。本节中,我们使用 S4 类重新定义 product 对象:set 阅读全文
posted @ 2019-02-11 10:59 NAVYSUMMER 阅读(352) 评论(0) 推荐(0)
摘要:在 R 中,S3 对象系统是一个简单且宽松的面向对象系统。每个基本对象的类型都有一个 S3 类名称。例如:integer、numeric、character、logical、list 和 data.frame 等都属于 S3 类。举个例子,vec1 的类型是 double,意味着 vec1 的内部类 阅读全文
posted @ 2019-02-11 10:56 NAVYSUMMER 阅读(270) 评论(0) 推荐(0)
摘要:现在,我们可以尝试定义新类了。注意到 class(x) 获取 x 的类,而 class(x)<-"some_class"将 x 的类设为 some_class。1.使用列表作为底层数据结构就像 lm 和 rpart,列表可能是创建新类时使用最广泛的底层数据结构。这是因为类描述了对象的类型和对象之间交 阅读全文
posted @ 2019-02-11 10:55 NAVYSUMMER 阅读(425) 评论(0) 推荐(0)
摘要:在前面的小节中,我们掌握了如何运用 R 中已有的类和方法处理模型对象。在 S3 系统中,允许自行创建类和泛型函数。前面的例子中,我们使用条件表达式模拟了 head( )的方法分派。虽然模拟成功了,但一般不建议这样做。S3 泛型函数非常灵活,而且很容易拓展。在定义泛型函数时,我们通常创建一个函数去调用 阅读全文
posted @ 2019-02-11 10:52 NAVYSUMMER 阅读(494) 评论(0) 推荐(0)
摘要:S3 泛型函数和方法在统一各种模型的使用方式上是最有用的。例如,我们可以创建一个线性模型,使用泛型函数从不同角度查看模型信息:lm1 <- lm(mpg ~ cyl + vs, data = mtcars)在前面的章节中,我们提到过线性模型本质上是由模型拟合产生的数据字段构成的列表。这就是为什么 l 阅读全文
posted @ 2019-02-11 10:51 NAVYSUMMER 阅读(178) 评论(0) 推荐(0)
摘要:正如本章前面提到的,一个类可以用多种方法定义它的行为,尤其是它与其他类的关系。在 S3 系统中,我们可以创建泛型函数(generic function),对于不同的类,由泛型函数决定调用哪个方法,这就是 S3 方法分派(method dispatch)的工作机理。对象的类不同,其方法分派也不同。因此 阅读全文
posted @ 2019-02-11 10:48 NAVYSUMMER 阅读(216) 评论(0) 推荐(0)
摘要:继承是面向对象编程的另一个重要概念。所谓继承,就是指一个类继承了另一个基础(或高级)类的行为,并且还有一些新的特征。通常来说,基础类是一个更抽象更宽泛的概念,继承类则比较具体和明确。这些都可以从日常生活中得到证实。举个例子,dog 和 cat 是两个类,并且从 animal 类中继承而来。anima 阅读全文
posted @ 2019-02-11 10:46 NAVYSUMMER 阅读(106) 评论(0) 推荐(0)
摘要:如果你是来自 Java、Python、C++、C# 等编程语言的开发人员,那么,应该熟悉面向对象的编码风格。但是,如果不熟悉任何其他面向对象的编程语言,就可能会对这个术语感到困惑,因为它听起来有点抽象。但是,不必担心,我们从编程的核心出发,就会发现 它其实很容易理解。当我们谈到编程时,实际上是在讲如 阅读全文
posted @ 2019-02-11 10:46 NAVYSUMMER 阅读(110) 评论(0) 推荐(0)
摘要:本章最重要的概念就是类和方法。类描述对象是什么?方法定义对象可以做什么?对于这些概念,现实世界中的示例不计其数。例如,animal 是一个类,在这个类中,我们可以定义诸如发声和移动等方法。vehicle 也是一个类,在这个类中,我们可以定义诸如启动、移动和停止等方法。类似地,person 也是一个类 阅读全文
posted @ 2019-02-11 10:45 NAVYSUMMER 阅读(144) 评论(0) 推荐(0)
摘要:上一章,我们掌握了环境的结构和性质,以及如何创建并访问环境。环境在惰性求值、复制—修改和词法作用域中起到了非常关键的作用,在创建和调用函数时,相关的环境会自动启用这些机制。对函数的运行方式有了扎实的理解之后,就可以学习函数更高级的用法。本章将要学习使 R 在交互式分析中更灵活的元编程(Metapro 阅读全文
posted @ 2019-02-11 10:43 NAVYSUMMER 阅读(133) 评论(0) 推荐(0)
摘要:上一节介绍了 R 中的函数式编程工具,理解了函数只是另一种可以被传递的对象。当创建一个新函数 fun( ) 时,也同时创建了一个与函数相关联的环境。这个环境被称作函数的封闭环境,可以通过 environment(fun) 访问。每次调用该函数时,一个新的包含尚未求值的实参(也称为 promise ) 阅读全文
posted @ 2019-02-11 10:40 NAVYSUMMER 阅读(228) 评论(0) 推荐(0)
摘要:在前面几节中,我们学习了如何使用 quote( ) 和 substitute( ) 将表达式捕获为语言对象,以及如何使用 eval( ) 在给定列表或环境中计算表达式。这些函数组成了 R 中元编程的基本功能,这使我们能够调整标准计算。元编程的主要应用是执行非标准计算以使某些特定用法更容易。接下来的内 阅读全文
posted @ 2019-02-11 10:39 NAVYSUMMER 阅读(250) 评论(0) 推荐(0)
摘要:捕获表达式之后,下一步就是对其进行求值,可以用 eval( ) 函数完成这个工作。例如,如果在控制台键入 sin(1) 并且按下回车键,会立即显示出结果:sin(1)## [1] 0.841471为了控制 sin(1) 的计算过程,我们可以使用 quote( ) 捕获此表达式,然后调用eval( ) 阅读全文
posted @ 2019-02-11 10:38 NAVYSUMMER 阅读(394) 评论(0) 推荐(0)
摘要:当我们在控制台输入一个表达式并按下回车键时, R 会执行表达式并显示输出结果。如下例所示: rnorm(5)## [1] 0.54744813 1.15202065 0.74930997 -0.02514251## [5] 0.99714852这里生成了 5 个随机数。subset( ) 神奇的地方 阅读全文
posted @ 2019-02-11 10:35 NAVYSUMMER 阅读(153) 评论(0) 推荐(0)
摘要:上一章,我们系统地学习了函数的工作方式,包括参数何时被计算(惰性求值),修改参数会发生什么(复制—修改),以及在何处查找未在函数内部定义的变量(词法作用域)。这些术语看起来好像有些难度,但其实并不难。在接下来的内容中,我们将学习两种函数:一种是在函数内部定义的函数,另一种是与其他函数组合使用的函数。 阅读全文
posted @ 2019-02-11 10:32 NAVYSUMMER 阅读(112) 评论(0) 推荐(0)
摘要:上一节讨论了闭包,即定义在父函数中的函数。接下来要讨论的是高阶函数,也就是将另一个函数作为参数的函数。在进入这个专题之前,我们需要先了解一下,当一个函数作为变量或参数传递给另一个函数时的具体运行方式。1.为函数创建别名首先要考虑的问题是:如果将一个现有的函数赋给一个变量,会影响函数的封闭环境吗?如果 阅读全文
posted @ 2019-02-11 10:31 NAVYSUMMER 阅读(164) 评论(0) 推荐(0)
摘要:函数内部定义的函数称为闭包(closure)。闭包的特点是在其函数体中,可以使用局部参数,也可以使用其父环境中的变量。举个例子,假设我们有如下函数:add <- function(x, y) {x + y}此函数有两个参数。每次调用 add( ) 函数时,都需要提供这两个参数。如果使用闭包,就可以生 阅读全文
posted @ 2019-02-11 10:29 NAVYSUMMER 阅读(203) 评论(0) 推荐(0)
摘要:在前面的章节中,我们已经学习了 R 语言的基础功能,并且了解了如何运用向量、矩阵、列表和数据框表示不同形式的数据,以及用内置函数解决简单的问题。但是仅仅了解这些功能并不能解决所有问题。现实中的数据分析通常需要对数据进行仔细的转换和聚合,而这些操作则需要各种各样内置的或是由扩展包提供的函数。为了避免对 阅读全文
posted @ 2019-02-11 10:22 NAVYSUMMER 阅读(165) 评论(0) 推荐(0)
摘要:我们学习了惰性求值、复制—修改机制和词法作用域。这些机制与一种对象高度相关,那就是环境。事实上,词法作用域完全依赖于环境。尽管环境看起来与列表很相似,在某些方面它们其实是完全不同的两个概念。下面几节我们会通过创建和操作环境对象来了解它的行为,以及查看它的结构如何决定 R 函数的运行。 环境对象 创建 阅读全文
posted @ 2019-02-11 10:21 NAVYSUMMER 阅读(113) 评论(0) 推荐(0)
摘要:不仅是全局环境,函数环境也会控制符号的查找。有 3 个与函数及其运行过程相关的重要环境:执行环境(executing environment)、封闭环境(enclosing environment)和调用环境(calling environment)。每次调用函数时,R 都会创建一个新的环境来主管函 阅读全文
posted @ 2019-02-11 10:18 NAVYSUMMER 阅读(148) 评论(0) 推荐(0)
摘要:环境有父环境,如果一个符号不存在于环境中,R 就会到它的父环境中查找。假设我们对环境中的一个变量使用 get( ) 函数。如果在此环境中找到该变量,则获取其值,否则函数将会在父环境中查找该变量。和前面创建环境 e1 一样,我们再创建一个新的环境 e2,令 e1 为 e2 的父环境:e2 <- new 阅读全文
posted @ 2019-02-11 10:17 NAVYSUMMER 阅读(145) 评论(0) 推荐(0)
摘要:我们使用 new.env( ) 函数创建一个新环境:e1 <- new.env()环境通常用十六进制数表示,即内存地址:e1## <environment: 0x0000000014a45748>我们可以用提取操作符($ 和 [[)在环境中创建变量,其代码形式类似于修改一个列表:e1$x <- 1e 阅读全文
posted @ 2019-02-11 10:15 NAVYSUMMER 阅读(216) 评论(0) 推荐(0)
摘要:环境是由一组名称组成的对象,每个环境(除了空环境)都有一个父环境。每个名称(也称为符号或变量)都指向一个对象。当我们查找一个符号时,如果它在当前环境中,R 就会在当前环境中搜索并返回该符号指向的对象。如果这个符号在当前环境中没有找到,R 就会到它的父环境中搜索(直到找遍所有环境)。图 8-1 说明了 阅读全文
posted @ 2019-02-11 10:13 NAVYSUMMER 阅读(105) 评论(0) 推荐(0)
摘要:上一节我们介绍了复制—修改机制,示例中给出了触发该机制的两种情况。当一个对象有多个名称或作为参数传递给函数时,修改这个对象会先复制它,然后再修改它的副本。对于在函数外修改对象,我们介绍了<<- 的用法,首先找到函数外的变量,然后修改该对象而不是局部复制。这就引出了一个重要的概念,即函数有内部和外部之 阅读全文
posted @ 2019-02-11 10:11 NAVYSUMMER 阅读(115) 评论(0) 推荐(0)
摘要:前一节中我们展示了惰性求值的工作机制,通过避免不必要计算,节省时间和内存。本节要介绍 R 的一个重要特性,以便更安全地处理数据。我们先创建一个简单的数值向量 x1:x1 <- c(1, 2, 3)然后将 x1 的值赋给 x2:x2 <- x1现在 x1 和 x2 的值完全相同。如果我们修改其中一个向 阅读全文
posted @ 2019-02-11 10:10 NAVYSUMMER 阅读(165) 评论(0) 推荐(0)
摘要:如果能够理解 R 函数的运行机制,那么对 R 的运行机制就能够掌握十之八九。通过前几章的学习,我们掌握了一些最常用的基本函数的用法,但是可能对其内部机制仍有疑惑。比如创建如下的函数:test0 <- function(x, y) {if (x > 0) x else y}这个函数有点特殊,看似只有当 阅读全文
posted @ 2019-02-11 10:07 NAVYSUMMER 阅读(575) 评论(0) 推荐(0)

交流群 编程书籍