这个问题是this的延续,但由于可以在不知道我之前的问题的情况下回答,我想发布一个新问题就是这样做的方法(对不起,如果这不是案件)。在上一个问题中,我被告知将Mata代码放在我的.ado文件的末尾会使本地var2
在Stata代码中可用。一个最小的例子是:
program define hello
args var1
local sum_var=`var1'+`var2'
disp `sum_var'
end
mata
void cens_func(todo, x, y, g, H)
{
y = (x-1)^2
}
S = optimize_init()
optimize_init_evaluator(S, &cens_func())
optimize_init_which(S, "min")
optimize_init_params(S, 2)
temp=optimize(S)
st_local("var2",strofreal(temp))
end
,遗憾的是没有运行。我收到无效的语法错误。首先使用Mata代码在.do文件中运行它,不会导致错误。我在这里错过了什么?提前谢谢。
答案 0 :(得分:1)
具体来说,你没有定义var2
因此单独应该导致。{1}}
首先将local
分配给失败,因为Stata会看到悬挂加号
标志。
如果只是因为Mata,有任何情况下都无法运作 函数永远不会被Stata代码调用。
通常,"等报告不会运行"甚至"语法错误"不是
真实的信息,因为他们没有给别人什么是真正的线索
发生。 Stata在这里没有错,因为它提供了调试工具
使用set trace on
,您可以看到哪条线路出现故障。
将此作为do文件运行只定义一个程序;它没有证明这一点 这是合法的甚至是正确的。
在这个证据上,你应该尝试先写一些简单的程序 你有一个现实的前景,让这个工作。甚至复制一些 本手册中的示例程序将有所帮助。
答案 1 :(得分:1)
我将在昨天回复我的回答。 Mata将创建一个新的本地,或更改现有的本地,但在创建之前,您不能使用本地。与Mata无关,改变了这一点。
从Stata调用Mata时,请参阅help m1_ado
。
因此,在您的代码中,在尝试使用var2
之前,您需要进行Mata调用,因为您的Mata函数会创建var2
。
答案 2 :(得分:1)
我这样做了很多:
program define...
tempvar var2
gen `var2' = <<whatever>>
mata: myroutine("`var2'")
end
mata:
void myroutine(string scalar inputvar)
{
real vector v
st_view(v,.,inputvar)
<<use v somehow>>
}
end
您也可以使用st_store
来编写新的Stata变量。我的代码只是将其读入Mata。