在.ado文件中使用Mata - 语法错误

时间:2012-11-28 10:21:36

标签: stata

这个问题是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文件中运行它,不会导致错误。我在这里错过了什么?提前谢谢。

3 个答案:

答案 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。