生成旧宏的前缀字的新宏

时间:2016-09-04 13:08:11

标签: loops stata stata-macros

定义宏library(networkD3) library(visNetwork) library(dplyr) data(MisLinks) data(MisNodes) visNetwork( MisNodes %>% rename("label"=name) %>% mutate(id = seq_len(nrow(MisNodes))-1), MisLinks %>% rename("from"=source, "to"=target) ) %>% visNodes( shape = "image", image = "http://cdn0.iconfinder.com/data/icons/octicons/1024/mark-github-128.png" )

try

这将生成一个值为local try "a b c" 的宏。

现在我想要一个新值a b c,它取值try2。也就是说,我想为旧宏的每个元素添加相同的前缀,并将其定义为新的宏。

2 个答案:

答案 0 :(得分:2)

据我所知,在官方的Stata中没有特别支持的功能。有关附近的功能,请参阅help macrolists

旧包listutil(SSC)包含各种命令,prelist是相关的。我写了这个,所以它不会对其他人不利。让我建议只应用一般技术的工作。

local try "a b c" 
local copy `try' 
gettoken first copy : copy 

while ("`first'" != "") { 
    local try2 `try2' d`first' 
    gettoken first copy : copy 
} 

di "try is {col 12} `try'"  
di "try2 is{col 12} `try2'" 

答案 1 :(得分:1)

你也可以使用Mata来做到这一点。

local try "a b c"
mata: st_local("try2", invtokens("d" :+ tokens(st_local("try"))))

assert "`try2'" == "da db dc"

用语言来说,这就是第二行所做的,首先解释最内层的功能:

  1. st_local("try"):访问局部变量中的内容。这应该评估为" a b c"。
  2. tokens("a b c"):将字符串拆分为标记,例如tokens("a b c") - > ("a", "b", "c")
  3. "d" :+ ("a", "b", "c"):在Mata中,您可以使用+连接字符串,此处:+执行此元素,因此结果将是(" da&#34 ;," db",dc")。
  4. invtokens(("da", "db", dc")):将令牌放回字符串,即invtokens(("da", "db", dc")) - > "da db dc"
  5. st_local("try2", "da db dc"):Mata相当于local try2 "da db dc"
  6. 您可以通过以下方式找到有关Mata功能st_local()tokens()invtokens()的更多信息。 help mf_st_local