在R中包含从外部文件起作用的源代码

时间:2013-02-20 14:29:32

标签: r scoping reproducible-research

我有一个标准的数据分析程序,我需要在各种(~50个数据集)上运行。我已经开发了一段时间了,现在我已经到了我想把它变成一个函数,它接受一个数据集并为每个数据集吐出一些合理的表。但是,完成的过程跨越了四个脚本文件,到目前为止,我已经使用source从一个到另一个来运行它,但似乎用function似乎是不可能的。

我遇到以下问题:

foo <- function(data) {
  a <- somevariable
  source("..somefile..") #The code in there uses a, but a is not in the workspace...
  ..
  continue
  ..
}

在数据集上运行代码时代码崩溃。

是否有一些方法(命令)只是在编译时复制粘贴来自其他文件的命令(不知道我怎么能以不同的方式调用它,即使它不是真正的编译)函数?我知道我可以自己复制粘贴,但我不愿意,因为各种步骤包括神经网络和ARFIMA估计,为了代码的可读性,我想将它们保存在单独的文件中。无论如何,复制粘贴之后的功能就像200行代码一样,这绝对不是用户友好的......

THX

3 个答案:

答案 0 :(得分:1)

我建议从一个最小的例子开始,这样你就可以了解编写函数的内容,如何使用source()将函数加载到R中,如何使用参数以及如何调用函数。在这样做之后,希望更明显的去哪里。

要回答你的问题,如果你的脚本包含200行代码而且只做一件事(也就是说,它只做一个FUNCTION),你应该考虑将它包装到一个函数中,是的。这实际上会增加用户友好性而不是减少它,因为你的脚本现在只能包含一行(函数调用)而不是原始的200行代码。

答案 1 :(得分:0)

我猜这里,但是这样的事情:

myfunc <- function() {
if (something) source("path to script")
} else {
if (another thing) source("path to another script")
}
Do calcs and return the result
}

或者脚本的路径可以是函数参数。

答案 2 :(得分:0)

我理解你的问题,我假设你想使用函数source在函数内部使用proc,所以你只需要添加参数local = T

实施例

#This is your source code
y<-x+1
#save in your favorite path as "your_path.R"

#Function where you will call the above code
your_function<-function(x){
source("your_path.R",local=T) #plus 1 to x. IMPORTANT: local=T
return(y)
}