Stata 在.ado文件中使用Mata-语法错误
这个问题是我之前问题的延续,但由于我可以在不知道我之前问题的情况下回答这个问题,我认为发布一个新问题是解决这个问题的方法(如果不是这样的话,我很抱歉)。在前面的问题中,我被告知将Mata代码放在.ado文件的末尾将使本地Stata 在.ado文件中使用Mata-语法错误,stata,Stata,这个问题是我之前问题的延续,但由于我可以在不知道我之前问题的情况下回答这个问题,我认为发布一个新问题是解决这个问题的方法(如果不是这样的话,我很抱歉)。在前面的问题中,我被告知将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
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文件中运行此命令不会导致任何错误。我错过了什么?提前感谢。特别是,您没有定义
var2
,因此仅此一项就应该导致
由于Stata将看到挂起的加号,本地的第一次分配失败
签字
在任何情况下,如果只是因为Mata
Stata代码从不调用函数
通常,诸如“未运行”或甚至“语法错误”之类的报告都不会运行
信息量很大,因为他们没有给其他人真正的线索
发生Stata在这里没有错,因为它提供了调试工具
如果设置trace on
,您可以看到哪一行失败
将其作为do文件运行只是定义了一个程序;它不能证明这一点
这是合法的,甚至是正确的
有了这个证据,你应该试着写一些简单的程序
你有一个现实的前景让这个工作。甚至复制一些
手册中的示例程序将有所帮助 具体来说,您没有定义var2
,因此仅此一项就应该导致
由于Stata将看到挂起的加号,本地的第一次分配失败
签字
在任何情况下,如果只是因为Mata
Stata代码从不调用函数
通常,诸如“未运行”或甚至“语法错误”之类的报告都不会运行
信息量很大,因为他们没有给其他人真正的线索
发生Stata在这里没有错,因为它提供了调试工具
如果设置trace on
,您可以看到哪一行失败
将其作为do文件运行只是定义了一个程序;它不能证明这一点
这是合法的,甚至是正确的
有了这个证据,你应该试着写一些简单的程序
你有一个现实的前景让这个工作。甚至复制一些
手册中的示例程序将有所帮助 我将回顾我昨天的回答。Mata将创建新本地或更改现有本地,但在创建本地之前不能使用它。与Mata无关,Mata改变了这一点
从Stata调用Mata时,请参见帮助m1\u ado
因此,在代码中,当Mata函数创建var2
时,在尝试使用var2
之前,需要进行Mata调用 我将回顾我昨天的回答。Mata将创建新本地或更改现有本地,但在创建本地之前不能使用它。与Mata无关,Mata改变了这一点
从Stata调用Mata时,请参见帮助m1\u ado
因此,在代码中,当Mata函数创建var2
时,在尝试使用var2
之前,需要进行Mata调用 我经常这样做:
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
程序定义。。。
tempvar var2
gen'var2'=
mata:myroutine('var2'))
结束
马塔:
void myroutine(字符串标量inputvar)
{
实向量v
st_视图(v,,,输入变量)
}
结束
您还可以调用st_store
来编写一个新的Stata变量。我的代码只是将其读入Mata。我经常这样做:
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
程序定义。。。
tempvar var2
gen'var2'=
mata:myroutine('var2'))
结束
马塔:
void myroutine(字符串标量inputvar)
{
实向量v
st_视图(v,,,输入变量)
}
结束
您还可以调用
st_store
来编写一个新的Stata变量。我的代码只是将其读入Mata。谢谢您的回复。我认为这是一个相当简单的程序,我怀疑你没有理解我的问题。我所希望的就是能够在Mata环境中进行一些操作,例如最大化/最小化某个函数,并将其作为local
输出,以便在Stata环境中使用。上面的Mata代码运行得非常好,只是最小化函数(x-1)^2的一种方法。也许是这样,但您的Mata代码没有链接到Stata代码。我理解你的问题是为什么这个程序不起作用,我给出了一些提示。我想你误解了斯塔塔和玛塔一起工作的方式。在您编写的程序中,如果Stata代码未调用Mata代码,则不会使用Mata代码。与以前一样,您可以在程序文件中定义任意数量的Mata函数,但如果不调用它们,则不会发生任何事情。特别是,如果调用Mata代码,它将只定义一个本地代码,例如var2
。感谢您的回复。我认为这是一个相当简单的程序,我怀疑你没有理解我的问题。我所希望的就是能够在Mata环境中进行一些操作,例如最大化/最小化某个函数,并将其作为local
输出,以便在Stata环境中使用。上面的Mata代码运行得非常好,只是最小化函数(x-1)^2的一种方法。也许是这样,但您的Mata代码没有链接到Stata代码。我理解你的问题是为什么这个程序不起作用,我给出了一些提示。我想你误解了斯塔塔和玛塔一起工作的方式。在您编写的程序中,如果Stata代码未调用Mata代码,则不会使用Mata代码。与以前一样,您可以在程序文件中定义任意数量的Mata函数,但如果不调用它们,则不会发生任何事情。特别是,如果调用了Mata代码,它只会定义一个局部变量,例如var2
。我完全同意你的论点,即必须调用它。我的问题是,当查看help m1时_