我是一名在Stata土地上挣扎的R爱好者。我在尝试从R“转换”为Stata时遇到了以下问题:
在R中,所以我的脚本文件不会变得太大和疯狂我喜欢用较小的部分写它们然后有一个主要的R脚本读取较小的部分,例如
source("script-1.R")
source("script-2.R")
等...... 我想在Stata做同样的事情,并尝试过做
do "script-1.do"
do "script-2.do"
等...... 但是,我发现如果我在script-1.do
中创建一个宏,例如local bird 1
对象/宏鸟在主脚本中无法访问或script-2.do
可访问。如果我尝试在主脚本中显示bird
的内容,则它只是空的。
这是为什么?有什么建议吗?
答案 0 :(得分:6)
尝试使用include
。您可以在此处了解include
和do
(或run
)之间的差异:
答案 1 :(得分:6)
Stata宏分为两组:local
和global
。 local
仅存在于定义它们的过程中(可以是交互式会话,执行文件或program
)。如果您在script-1.do
中定义了某些内容,那么它只会在那里存在,您必须明确return
才能在其他地方看到它。 (Do-files不能真正做到这一点;你必须定义一个program, rclass
来返回值,并将代码块分成program
是一个很好的做法。)避免{{1} }宏除非绝对,不可避免地需要。
R可以控制其对象的范围,但与Stata对宏的控制相比,它几乎没有任何好处。变量和数据集在Stata中仍然是全局的,并且一次不能有多个数据集。 Stata的另一件事是令人惊喜的是通过引用传递参数,与R传递值相比,这节省了大量内存。因此,不同的包具有不同的优势,并且说一个比另一个更好是短视的。
话虽如此,基思建议使用global
是正确的。我只是试着解释你问题的“为什么”部分。此外,如果您需要在程序之间交换的是一个数字,您可以将其存储在一个明确命名的include
中,该scalar
将对所有进程可见。