相当于c ++包含在R中

时间:2015-09-01 08:51:58

标签: r

我有3个脚本logs.Rfunc.Rmain.R,我想从mainfunc脚本中记录。我知道我可以使用source来获取两个脚本中的功能,但在logsfunc中采购main与采购它2次相同(我在func中填写了main。来自#pragma once的{​​{1}}或#ifndef #define #endif是否等效?

3 个答案:

答案 0 :(得分:4)

您可以使用自定义变量和条件来模仿它。

logs.R

...
log.sourced <- TRUE

func.R

if(!exists("log.sourced")) source("logs.R")
...

main.R

if(!exists("log.sourced")) source("logs.R")
...

或者只测试exists("func"),其中func在logs.R中定义

答案 1 :(得分:1)

使用source("otherfile.R")包含其他文件的内容。 (相当于包括)。

由于R是直接解释且未经过预处理,因此不存在#pragma once包含警卫指令的等效内容。

替换包含警卫的一种方法是直接在R中写入。

答案 2 :(得分:1)

由于基础R中没有适当的解决方案,并且其他解决方案需要包括防护等hacky机制,我编写了自己的包:modules

使用模块,您可以编写以下代码:

logs = import('logs')

现在,您可以将logs用作您在其他语言中习惯使用的包/命名空间:logs$log('Some string I’d like to log.')。或者,您也可以

import('log', attach = TRUE)

这模仿R的正常附着机制,类似于C ++中的using namespace foo。有关更深入的介绍,请参阅“modules” vignette