16

很抱歉,如果以前有人问过这个问题,但我找不到答案。

假设我在 R 中编写了一个小函数

add2<-function(a){
return(a+2)
}

我将它作为 add2.R 保存在我的主目录(或任何目录)中。我如何让 R 找到它?

> add2(4)
Error: could not find function "add2"

我知道我可以打开脚本,在控制台中复制/粘贴它,运行它,然后它就可以工作了。但是我如何让它内置,所以如果我打开和关闭 R,它仍然可以在没有我复制和粘贴的情况下运行?

4

3 回答 3

20

一种轻量级选项:

dump("add2", file="myFunction.R")

## Then in a subsequent R session
source("myFunction.R")

替代:

save("add2", file="myFunction.Rdata")

## Then just double click on "myFunction.Rdata" to open  
## an R session with add2() already in it 

## You can also import the function to any other R session with
load("myFunction.Rdata")

在您准备好将函数打包到您自己的私有包中之前,将它们存储在组织良好、source()就绪的文本文件中(如上面的第一个示例)可能是最好的策略。有关经验丰富的用户如何将这种方法付诸实践的一些示例,请参阅这个投票率很高的 SO 问题。

于 2013-01-18T16:40:17.030 回答
4

在调用函数之前(例如在脚本的开头),您应该source包含用户定义函数的文件,即:

source("add2.R") # this executes add2.R script loading add2 function

基本上,source函数执行作为参数传递的脚本中包含的代码。因此,如果文件仅包含函数定义,它会将函数加载到内存中以供将来使用。

于 2013-01-18T16:38:16.580 回答
4

如果要自动启动它,则必须设置启动脚本,然后使用上面答案中概述的方法之一。

/Library/Frameworks/R.framework/Versions/2.15/Resources/etc/是(对于mac)Rprofile.site的位置,必须进行充分的编辑。

我的版本是:

.First <- function()
{ 
    dir='~/Desktop/Infobase/R/0_init/0_init.R'
    if(file.exists(dir))
    {
    source(dir, chdir = TRUE) 
    } else {cat("startup file is not found at:",dir)}
    cat("\nWelcome at", date(), "\n")
}    

.Last <- function()
{ 
cat("\nGoodbye at ", date(), "\n")
}

请注意,在您获取了 1 个 R 脚本后,您不再需要输入此文件。只需从您获取的文件中完成您需要的一切。在我的情况下,文件“0_init.R”不包含任何功能,它只包含其他脚本的加载。嗯,你有这个想法。

此外,如果您这样做,我建议您将它们存储在新环境中。实际环境并不真正适合您自己的功能(如果您开发了一个包,它们会更好地实现,否则您会失去很多控制权)。

使用“附加”、“分离”、“搜索”等......

attach(FUN,name="af2tr")
于 2013-01-18T17:18:20.530 回答