数据科学的JavaScript

2021-04-26 10:52:43

本书现在可以直接从出版商或通过大多数在线书店购买。销售本书的所有特许权使用费都捐赠给R-Ladies,这是一个全球组织,其使命是促进R社区的性别多样性。

David Beazley认为“JavaScript与数据科学”将是这本书的更好标题。虽然那个词总结了多少人查看语言,但我们希望我们能够说服您现代的JavaScript是可用的,也有用。科学家和工程师是谁在考虑我们写这本书的时候,但我们希望这些课程也将帮助图书馆员,数字人文主义者以及在研究中使用计算的所有人。

与JavaScript的大多数介绍不同,这些课程甚至存在浏览器编程和服务器编程的混合。我们为每个主题提供浅覆盖;如果您想了解更多,还有许多其他免费教程,一旦您掌握了基础知识,其中一些就可以潜水,其中一些是最新和精心设计的。

每个课程都应该满足特定学习者的需求。[Wils2019]下面描述的三个人定义了这一点。

五年前在微生物学中获得了BSC,从那时起为一个有四个国家的实验室获得了生物技术公司。她使用R作为本科的统计课程,然后在软件木工车间中学到了更多的R和一些UNIX shell脚本,但没有其他培训作为程序员。 Banadra的团队正在开发工具,以检测蛋白质之间的结构性相似之处。他们希望为他们的工具构建浏览器界面,以便人们可以在各种数据集上测试不同的算法。本书将显示Bhadra如何构建,测试和部署该界面。

为自然资源部进行了三十多年的实地工作。他学习了Visual Basic,以便他可以编写Excel宏,然后掌握C,以便维护一些二手遥感设备的控制软件。 EFRaim最近退休,现在是几个公民科学项目的积极成员。本书将向他展示如何创建服务以与世界共享这些项目的数据,以及如何为其构建基于Web的管理界面。

在19世纪历史上完成了博士学位。作为她研究的一部分,她正在转录和编目数十日日本助产士的记录。她一直在创建和自定义WordPress网站几年,并在这样做时挑选了javascript的位数和碎片。 Sumi即将开始寻找工作,并希望创建一个互动网站来展示她的研究。本书将填补她知识中的一些差距,并向她展示如何利用JavaScript更现代的功能。

可以在UNIX shell中运行命令以导航文件系统并创建和删除目录和文件,以及

Maya Gans是一位自由数据科学家和前端开发者,通过定量生物学。她在R中有4年的经验编程,她对数据可视化的热情将她带到了JavaScript的奇怪世界。当她没有调试或博客的代码时,她就在远程攀登大型山脉的地方。她把这本书致力于她被告知他们不够好的自我教科的程序员,而是过于驾驶和兴奋地关心。

Toby Hodges是一位生物形态人员转向社区协调员,在EMBL的BIO-IT项目上工作。他在计算中教授了很多课程,组织了很多社区建设的事件,听了很多朋克摇滚,偶尔仍然发现时间写代码并骑自行车。托比想感谢他的妻子在发誓讨厌的JavaScript调试时支持和耐心。

Greg Wilson在工业和学术界工作了35年,是几本计算机上的作者或编辑和两个儿童。他共同创立了软件木工,这是一个非营利组织,向研究人员教授基本的计算技能,现在是Rstudio教育团队的一部分。格雷格想感谢漫游的大家,当他学习JavaScript时,他会和他在一起。

您可以在GitHub存储库中找到SRC目录中的每个章节的示例。每个子文件夹包含与文本一起关注所需的代码和数据。

每个章节结束时的练习包括稍后在书中需要的新信息,因此不是可选的。您可以使用Runkit这样的服务在线进行第一个在线,在浏览器中为您提供交互式JavaScript游乐场。对于较大的事情,对于创建动态网页(第7章)开始的章节,您应该下载并安装节点和NPM的最新的长期支持(LTS)版本。

节点是JavaScript的开源实现,其中包括像Python和R等语言的命令行解释器。命令节点在其自己的命令节点开始读取equate-print循环(repl),该读取循环(Repl)在键入时执行命令并显示其输出。命令节点filename.js读取并在filename.js中运行命令;我们将在第6章中看到如何在浏览器中运行JavaScript。

NPM是节点包管理器,用于查找,安装,更新,构建和执行JavaScript库的命令行工具。命令npm安装 - global库名称(没有.js扩展)全局安装一个库,以便所有项目都可以使用它,而NPM安装--Save库名称在本地安装库(即,在当前项目文件夹中安装库)。本地安装通常是一个更好的主意,因为它将项目彼此隔离。

欢迎各种各种贡献,从勘误表和次要改进完全新的部分和章节:请向我们的GitHub存储库提交问题或提出请求。将承认任何工作的工作;请注意,所有贡献者都需要遵守我们的行为准则(附录18)。请注意,我们使用简体英语而不是传统的英语,即美国而不是英国拼写和语法。我们鼓励翻译;如果您想参加此操作,请给我们发电子邮件。

如果您想报告勘误表或建议改进措辞,请在报告主体的第一行中包含章节名称(例如,测试数据分析)。

我们始终感谢Shashi Kumar寻求乳胶。我们也非常感谢来自:

在计算机上安装节点,然后运行命令节点 - version和npm --version以查看您拥有的版本。

本课程适用于那些了解循环和函数的人,但从未使用JavaScript或建立过Web应用程序。

节点是用于JavaScript的命令行解释器,可以交互方式或运行文件中的脚本。

NPM是节点包管理器,可用于查找,安装,更新,构建和执行JavaScript库。

本课程介绍了JavaScript的核心功能,包括如何运行程序,语言的基本数据类型,数组和对象,循环,条件,功能和模块。如果您之前已编程,则所有这些概念都应该熟悉。

使用您喜欢的文本编辑器将以下行放在名为Hello.js的文件中:

控制台是一个内置模块,提供基本的打印服务(以及其他事物)。与许多语言一样,我们使用点缀表示法x.y来获取事物x的部分x-in this-fil,以获取控制台的日志函数。像“你好,世界”这样的字符串可以用单引号或双引号编写,只要报价标记匹配,现在(大多数)是可选的报表末尾的半冒号。

要运行程序,请在命令行中键入节点program_name.js。 (我们将以$介绍shell命令,使其更容易发现。)

JavaScript具有通常的数据类型,虽然与C,Python和许多其他语言不同,但Integers没有单独的类型:它将所有数字存储为64位浮点值,这是最多可准确的大约15个十进制数字。我们可以使用typeof检查此返回字符串。 (注意:Typeof是一个运营商,而不是一个函数:我们通过键入空格,然后键入我们想要检查的东西的名称,例如,Typeof服装,而不是Typeof(连衣裙)。 )我们在下面的Const中使用它,当我们想要向常量值提供名称时,本身就是有用的:

功能也是一种数据类型,这是我们在第3章中探索的影响的事实:

我们将逐个显示其他基本类型,而不是显示一个列表中的三个值并循环它:

true的类型是boolean的undefined类型未定义null类型为对象

作为上面的示例,我们创建了一个值循环的值遍历,被称为其他值。我们用单词启动我们的循环。在括号内,允许创建一个名为值的变量以迭代其他元素,并且值是更改差别的数组值。最后,在卷曲括号内,我们对每个值执行所需的操作。

请注意,我们使用令人越来越旧的var,而不是:后者返回收集的索引(例如,0,1,2),这对于令人难以求值(附录23.2)具有一些陷阱。还要注意,索引从0而不是1开始,并且该缩进是可选的,仅用于可读性目的。这可能与您习惯的语言不同。

除非他们真的需要变量,否则您应该制作常量,因为人们和计算机更容易跟踪定义一次并且永远不会改变的事情。

毕竟这一点,类型本身都有稍微天赋。 JavaScript的Boolean类型可以是真或假的,但我们将在下面看到其他东西可以被视为布尔值。未定义的手段“尚未给出一个值”,而NULL表示“有一个值,哪个是什么”。

我们已经看过循环和扁平阵列,因此让我们看看嵌套数组和条件。我们从包含其他数组的阵列开始,这通常由嵌套循环处理:

内循环运行一个完整的迭代循环,用于外环的每个迭代。分配给变量外部的每个值是一对,因此分配给内部的每个值是来自该对的两个字符串之一(图[F:基础遍历])。

JavaScript程序也可以做出选择:如果且仅当条件为真,则执行if语句的正文。如果条件不正确,则每个IF可以有别的,其正文仅执行:

类型0的类型为类型数为字符串的真实性是字符串的falsytext是类型的rotefinded of type untefined是falsynull类型对象的falsynull是类型对象的falsy为tracty2,3类型对象是真实的

此示例显示阵列是异构的,即,它们可以包含许多不同类型的值。它还表明JavaScript对真理性质有一些相当奇怪的想法。 0是狡猾的,而所有其他数字都是真实的;同样,空字符串是伪造的,所有其他字符串都是真实的。由于大多数程序员预期,undefined和null都是伪造的。

但作为最后两行的输出展示,空数组是真实的,这与大多数编程语言的治疗不同。 JavaScript倡导者所作的参数是在那里存在一个空数组,它恰好是空的,但这种行为仍然是错误的常见原因。测试数组时,请检查array.length为零。 (请注意,这是一个属性,而不是一种方法,即,它应该被视为一个变量,而不是像函数一样被叫。)

始终使用===(三重等级)和!==在测试JavaScript中的平等和不等式时。 ==和!= DO类型转换,可以产生一些丑陋的惊喜(第23.1节)。

而不是打印多个字符串和表达式,我们可以将值插入到后引号字符串中。 (我们必须使用背引号,因为在首次创建语言之后,此功能将很长时间添加到JavaScript中。)作为下面的示例,要插值的值将以$ {...}提供,并且可以是任何有效的JavaScript表达式,包括函数或方法调用。

颜色是红色和大写的是Redcolor是绿色和大写的是绿色彩色是蓝色和大写是蓝色的

javascript中的一个对象是一个密钥值对的集合,并且在简单的情况下是python调用字典的简单情况。通常是用一个列中的键和另一个列中的键可视化一个对象作为双列表(图[f:basics-object-table])。钥匙必须是字符串;值可以是任何东西。我们可以通过将钥匙值对放入Crly括号中创建一个对象;密钥和值之间必须有冒号,并且必须用逗号分隔成对,如数组元素:

对象的类型始终是对象。我们可以使用对象[key]获取与密钥关联的值,但如果密钥有一个简单的名称,我们可以使用object.key。请注意,方形括号形式可以与键的变量一起使用,但是虚线表示法不能:IE,Creature.genus与生物['属']相同,但分配g ='genus'之后是creature.g不行。

因为字符串键是如此常见,所以程序员经常使用简单名称,所​​以JavaScript允许我们创建对象而不引用键的名称:

当我们希望查看对象包含的内容时,[对象对象]不是特别有用的输出。要获得更有用的字符串表示,请使用json.stringify(对象):

在这里,“JSON”代表“JavaScript对象表示法”;我们将在第11章中了解更多信息。

函数使凡人可以通过允许我们一次思考它们来了解计划。以下是一个函数,可以在数组中找到最低值和最高值:

其定义由关键字函数,名称,参数(可能为空)及其正文的括号列表组成。

该函数的主体始于对函数中的函数中的测试,作为函数的参数提供。如果值没有长度-1.e,则它不包含多个条目 - 函数返回[未定义,未定义]。 (我们将解决练习中这种行为背后的理由。)

如果该初始检查发现,则值确实具有长度-1.,!值.Length返回false - 运行其余函数。这涉及首先初始化两个变量,低且高,它们的值设置为等于值的第一项。

在该函数的下一阶段中,所有值都遍历,低,并且如果该值分别低于低或高于高,则分配新值,等于下一个项目的新值。

一旦检查了所有项目中的所有项目,低和高的值都是值的最小值和最大值。这些在阵列内部作为对返回。

请注意,我们可以使用返回明确返回值的任何时间;如果没有返回任何内容,则函数的结果是未定义的。

一个奇怪的javascript是几乎可以与其他任何东西进行比较的。以下是一些证明这一点的测试:

限制是,9的限制为9,9,9,300个是3,300,300的苹果,葡萄柚,香蕉是葡萄柚,Bananalimits 3,Apple,子阵列为3,3

程序员通常不会以这种方式写入功能,因为它以奇数方式与语言的其他功能相互作用;第23.3节解释了为什么和更详细的方式。相反,大多数程序员现在编写由参数列表,=&gt的粗箭头函数。符号,身体。 FAT箭头函数没有名称,因此必须将该函数分配给常量或变量以供以后使用:

无论如何定义函数,每个都是一个范围,这意味着它的参数和在它内部创建的任何变量都是本地功能。我们将在第3章中更详细地讨论范围。

为什么JavaScript介绍另一个语法,而不是修复使用功能定义的行为?双重答案是,更改会破坏依赖旧行为的传统程序,而语言的开发人员希望使其真的很容易定义很少的功能。在这里和其他地方,我们将看到语言的历史和使用形状的演变。

随着我们的程序增长更大,我们将想要在多个文件中放入代码。不可避免的坏消息是JavaScript有几个模块系统:节点仍然使用一个名为CommonJS,但是正在转换为名为ES6的现代标准,因此我们在命令行上使用的是我们在浏览器中使用的内容(现在)的不同。

JavaScript的官方名称是ECMAScript,尽管只有在日常对话中使用“Datum”这个词的人才称之为。因此,逐次版本的语言称为ES5,ES6等,除非它们被称为(例如)ES2018。

由于我们将在浏览器中进行任何内容之前要构建命令行程序,因此我们将首先介绍节点的模块系统(图[f:基础辅助])。我们首先将此代码放在名为utmerities.js的文件中:

功能定义很简单;正如您可能已经猜到的那样,BUNDED = default_bound为该参数设置默认值,以便只需将剪辑调用。您也可能猜到该array.push将值附加到数组的末尾;如果你没有,那么现在你知道。

更重要的是将对象分配给module.exports。只有在这个对象中命名的那些东西都可以在外界看到,所以default_bound不会是。请记住,单纯名称的键不需要引用,因此剪辑:剪辑意味着“将引用引用与字符串键&#34关联;剪辑&#34 ;.

要使用我们的新定义模块,我们必须要求它。例如,我们可以将其放在application.js中:

要求返回分配给module.export的对象,因此如果我们已将其结果分配给名为实用程序的变量,则必须将我们的函数称为实用程序.Clip。我们使用从./或../导入本地文件的相对路径;以名称开头的路径从已安装的节点库中取出。

什么样的东西是类型的?这是表达式吗?功能?别的东西? (您可能会注意到Typeof Typeof在语法上无效。在这种情况下,互联网搜索引擎是您的朋友,也是Mozilla开发人员网络JavaScript参考。

4的平方是16个是3的2个是2的2个是4个是1是1的0是0

写一个名为Istruthy的函数,返回truit,即JavaScript考虑了真实的所有内容,并且对于除空阵列之外的所有内容的FALSE:Istruthy应该为那些返回false。

我们撰写了示例函数,限制,以返回[未定义,未定义]如果没有长度的变量被送入其中。 这样做的优势是什么,而不是返回undefined? nan代表什么? 您对下面的代码预期的输出是什么? 尝试运行它,看看结果是否符合您的期望。 使用现实世界数据时,这种行为的含义是什么? 我们如何使用此技术在SRC / Basics / Import.js中重写Require语句,以便可以直接调用剪辑(...)而不是实用程序.Clip(...)? 特殊值null和未定义的均值“无值”和“不存在”。 从'。'或'/'开始的路径在本地导入,但路径没有'。'或'/'在图书馆看。 jav. ......