我有3个脚本logs.R
,func.R
,main.R
,我想从main
和func
脚本中记录。我知道我可以使用source
来获取两个脚本中的功能,但在logs
和func
中采购main
与采购它2次相同(我在func
中填写了main
。来自#pragma once
的{{1}}或#ifndef #define #endif
是否等效?
答案 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。