问题
某个包已经安装好了,可能是安装R时就安装好了的标准包,或者是自己下载的包。如果直接在R中使用包中的函数,R会告诉你,它找不到这个函数。
解决方案
用library函数或者require函数将包加载到R中:
> library(packagename)
讨论
R本身自带了很多包,但并不是所有的包都会在R启动时就自定加载。类似的,可以从CRAN上下载和安装所需的包,但这些包也不会自动的加载到R中。例如,MASS包是R自带的,但如果直接使用其中的lda函数就会遇到这个问题:
> lda(x)
Error: could not find function "lda" #错误:找不到“lda”函数
R会报错,说它在已加载到内存的包中找不到lda函数。
在用library函数或者require函数时,R就会将相应的包加载到内存中,你就可以使用其中的函数、数据等各种东西:
> lda(f ~ x + y)
Error: could not find function "lda"
> library(MASS)
> lda(f ~ x + y)
Call:
lda(f ~ x + y)
Prior probabilities of groups:
.
. (省略)
.
在调用library之前,R无法识别这个函数名。在调用之后,就可以使用包中的东西,也就可以调用lda函数了。
要注意,不需要将包名称放在引号中。
require函数几乎跟library一模一样,但在编写脚本时它有两个有用的特性。如果包加载成功,它会返回TRUE,否则就会返回FALSE。如果包加载失败,require会发出警告,而library会报错。
这两个函数都一个共同的关键特性:他们不会加载已加载的包,所以调用这两个函数将同一个包加载两次并没有什么害处。这在编写脚本的时候很有用。在脚本中可以加载各种所需的包,而无需考虑这些包是否已经被加载。
detach函数可以将已加载的包卸载(unload):
> detach(package:MASS)
必须要明确地指定包名称,例如package:MASS。
如果某个包的函数跟搜索路径中靠后的某个同名函数发生冲突,就需要将其卸载。在发生这种冲突时,高优先级的函数就会掩盖低优先级的函数。R在找到高优先级的函数后就会停止搜索,你也就“看”不到低优先级的函数了。所以,这时候如果要使用低优先级的函数,就要把高优先级的包卸载。
扩展阅读
关于搜索路径,详见search函数。
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「我们」留言处理。