2.2 从帮助页面获取帮助
R自带的核心函数超过1000个,并且一直都有新成员加入其函数大家族。要想记住和学会所有函数几乎是不可能的。但所幸每一个R函数都有自己的帮助页面,你只需要键入问号加上一个函数的名称即可查看该函数的帮助页面。下面的代码示例中,每一个命令都会打开相应函数的帮助页面。这些帮助页面会出现在RStudio右下面板的Help选项卡中。
?sqrt ?log10 ?sample
帮助页面涵盖了函数的主要功能和使用方法等诸多有用信息。帮助页面同样有代码文档的功能,因此读起来可能是苦乐参半的。它们常常看起来是专门为已经对该函数有所理解,压根用不着帮助的那群用户所写的。
但也不用灰心,即便如此,从一个函数的帮助页面仍然能得到很多信息。可以只关注其中能理解的部分,而比较晦涩难懂的部分可以一带而过。这种做法必然会将你带到每个帮助页面中最有用的部分:最底部的代码示例部分。在这个部分,几乎每一个帮助页面都会给出一些使用该函数的代码示例。运行这些示例代码,有助于快速掌握该函数的基本功能。
如果一个函数来自某个R包,而你并没有安装或者加载该包,那么在R的控制台用问号加函数名的方式并不能调出该函数的帮助页面。
2.2.1 帮助页面的组成部分
每一个帮助页面都被分成了数个部分。各个部分因函数而异,但通常来说你都可以看到以下几个部分。
· 函数描述(Description)
一段简短的有关该函数功能的描述。
· 使用方法(Usage)
告诉你应该如何键入该函数和相应的参数名。参数的排列顺序应该符合R的预期,也就是该函数被定义时参数的排列顺序(这里指的是没有明确写出参数名的情况)。
· 参数(Arguments)
列出该函数所包含的所有参数,它们所接受的赋值类型以及每个参数在函数中的作用。
· 相关细节(Details)
关于该函数工作原理的进一步描述。函数的作者通常会利用这个部分提出该函数使用时的一些注意事项,以引起用户的注意。
· 返回值(Value)
一段关于该函数运行后的返回值的简短描述。
· 另请参阅(See Also)
与该函数相关的函数列表。
· 代码示例(Examples)
确保可以无错运行的代码示例。帮助页面内的代码示例通常会展示给用户数种使用该函数的方法,这有助于用户更好地了解该函数的作用。
如果不小心忘记了函数的确切名称,但又想找到这个函数的帮助页面,可以尝试关键词搜索。具体做法:进入R的命令行界面,在关键词之前键入两个问号再按回车键。R会列出所有与该关键词有关的帮助页面的超链接。你可以将此看作帮助页面的帮助页面。
?? log
让我们仔细看看sample函数的帮助页面。记住:我们想找到关于如何改变抽样过程中的抽样概率的信息。这里没有展示整个帮助页面(而只是有选择性地展示最相关的部分),你可以在自己的计算机上跟着下面的提示一步一步操作。
第一步,打开帮助页面。在RStudio中,帮助页面与绘图页面处于同一个面板中(但帮助页面在Help选项卡中,而绘图页面在Plots选项卡中)。
?sample
你看到了什么呢?从上往下应该是这样的信息。
Random Samples and Permutations(随机抽样与置换) Description(说明) sample takes a sample of the specified size from the elements of x using either with or without replacement.(sample函数从x中随机抽取放回样本或者不放回样本,样本的大 小由用户设置。)
还不错,我们都知道这些话代表什么意思。进入下一部分:Usage(使用方法)。这里包含了一个有价值的线索。它提到一个叫作prob的参数。
Usage sample(x, size, replace = FALSE, prob = NULL)
如果将帮助页面下拉至参数部分,可以看到此处关于prob参数的描述看起来非常像我们需要的信息。
A vector of probability weights for obtaining the elements of the vector being sampled. (对于欲抽样的向量中的元素,该参数是一个相同长度的向量,其元素对应被抽样向量中相应元素 的抽样权重。)
Details(相关细节)部分确认了我们刚才的判断,并且包含了进一步的说明和指导。
The optional prob argument can be used to give a vector of weights for obtaining the elements of the vector being sampled. They need not sum to one, but they should be nonnegative and not all zero.(prob是一个可选参数,用于在抽样时指定被抽样向量中每个元 素的抽样权重。该参数向量中的元素和可以不为1,但是必须保证每个元素都是非负值且不能同时 为0。)
虽然帮助页面中没有详细说明,但有必要指出的是,这个参数向量中的元素与被抽样向量中的元素是一一对应的。因此,prob的第一个元素对应的就是被抽样向量中第一个元素的抽样权重,第二个元素对应被抽样向量中的第二个元素的抽样权重,以此类推。这种元素对应的方式在R中是颇为常见的。
继续阅读帮助页面,有下面一段文字。
If replace is true, Walker's alias method (Ripley, 1987) is used...(如果replace参数 为true,则会使用Walker的别名方法(Ripley,1987)……)
好了,读到这样的描述也就意味着接下来我们只需略读即可。上面的信息已经足够用来为我们的骰子添加权重了。
练习
重写之前的掷骰子函数以实现一对有不同权重的骰子。
roll <- function() { die <-1:6 dice <- sample(die, size = 2, replace = TRUE) sum(dice) }
你应该在roll函数内部的sample函数中添加一个prob参数。这个参数应该能够指示sample函数在抽样时将1/8的抽样权重交给从1到5的五个点数,而点数6的抽样权重为3/8。
做完这个练习之后,看看下面的参考答案。
为了改变骰子的权重,需要在sample函数中设置prob参数,这个参数是一个包含权重值的向量,做法如下。
roll <- function() { die <-1:6 dice <- sample(die, size = 2, replace = TRUE, prob = c(1/8, 1/8, 1/8, 1/8, 1/8, 3/8)) sum(dice) }
该函数的效果就是在掷骰子时,点数1~5的权重仅为1/8,而点数6的权重为3/8。
用新函数覆盖之前的roll函数(即将上面的参考答案代码键入命令行中并运行),然后将新骰子的长期投掷结果绘制出来。图2-5中右边的图就是新骰子投掷结果的直方图,左边是旧骰子投掷结果的直方图。
rolls <- replicate(10000, roll()) qplot(rolls, binwidth = 1)
图2-5:右图显示,新骰子的投掷点数明显更加倾向于大点数组合,因为大点数组合出现的频率要远高于小点数组合出现的频率
该图说明我们刚才的新骰子函数有效地给点数设置了不同的权重。大点数组合出现的频率要远高于小点数组合出现的频率。但值得注意的是只有观测长期频率才能看到如此明显的效果。单次投掷的骰子点数看似仍是随机的。如果你在玩《卡坦岛移民者》这样的游戏,这可能是个好消息(你可以告诉朋友你丢了骰子)。但是如果你在分析数据,这种情况就会变得十分恼人,因为这意味着如果骰子被做过手脚,在短期内很难发现。
2.2.2 获取更多帮助
R的用户社区非常活跃,你可以通过R帮助邮件列表(https://stat.ethz.ch/mailman/listinfo/r-help)得到更多帮助。你可以在邮件列表中提问,但是很可能你所要提的问题已经存在并已经被解答了。为了避免重复提问,建议在提问之前先在已提问题存档(http://tolstoy. newcastle.edu.au/R/)中搜索确认一下。
相比R邮件列表,Stack Overflow(http://stackoverflow.com)的帮助模式更好。在这个网站上,程序员们会在线回答各种各样的问题,而答案的排序是由用户的打分值决定的,打分值越高代表答案越有用,其排序也就越高。我个人更喜欢Stack Overflow的帮助模式,其用户体验相比R邮件列表更加友好(回答问题的人相对来说也更加友善)。在Stack Overflow上,你可以上传自己的问题或者搜索已经提过的与R相关的问题。现在上面有3万多条与R相关的提问。
无论是使用R邮件列表还是Stack Overflow,如果提问时提供的实例代码具有良好的可重现性,那么得到有用回答的概率就会更大一些。可重现性是指他人在复制粘贴你所提供的代码并运行之后,可以得到与你预想的或碰到的问题一样的信息或者错误提示。