相当于c++;包含在R中

相当于c++;包含在R中,r,R,我有3个脚本logs.R,func.R,main.R,我想从main和func脚本中登录。我知道我可以使用source,在这两个脚本中都有函数,但是在func和main中查找log与在main中查找它两次相同(我在main中查找func)。从C++中是否有任何等效的#pragma once或#ifndef#define#endif?使用包含其他文件的内容。(相当于include) 由于R是直接解释的,没有预处理,因此不存在等同于#pragma once或include guards指令 替换包含

我有3个脚本
logs.R
func.R
main.R
,我想从
main
func
脚本中登录。我知道我可以使用
source
,在这两个脚本中都有函数,但是在
func
main
中查找
log
与在
main
中查找它两次相同(我在
main
中查找
func
)。从
C++
中是否有任何等效的
#pragma once
#ifndef#define#endif

使用包含其他文件的内容。(相当于include)

由于R是直接解释的,没有预处理,因此不存在等同于
#pragma once
include guards指令


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

您可以使用自定义变量和条件来模拟

日志

...
log.sourced <- TRUE
梅因河

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

或者只测试
是否存在(“func”)
,其中
func
在日志中定义。R

因为在基本R中没有合适的解决方案,而其他解决方案需要使用黑客机制,如include guard,所以我编写了自己的包:“”

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

box::use(./logs)
现在,您可以像在其他语言中使用的包/名称空间一样使用
logs
logs$log(“我想记录的某个字符串”)
。或者,你也可以这样做

box::use(./logs[...])

<>这模仿了R的正常附着机制,在C++中使用命名空间FoO 类似于<代码>。有关更深入的介绍,请参阅。

您是说,对同一个脚本进行更多次的寻源不会有问题吗?该脚本会在包含它的时间段内重新解释,因此从性能角度来看可能会有问题。当然,您可以编写一次onwn版本的
source\u
,但没有什么可以阻止多次重新分配函数您是否考虑过将
func
放在一个地方,并将其导入到其他脚本中,以完全避免问题?否,我不想要一个没有人可以阅读的庞大脚本:正如两个答案所示,它有一个明确的答案,而不是“太多可能的答案”。+1。正如
#ifdef
/
#ifndef
/
#define
这样的逻辑方式是特定于编译器的(它们的需求也是特定的),模仿行为听起来是最好的方式。
box::use(./logs[...])