如何避免解析宏中字符串的内容
How to avoid parsing the contents of strings in a macro
我很懒惰,厌倦了使用这样的代码(在 0.4 RC 上)在数据框中选择行:
using DataFrames
data = DataFrame(num=[1,2,3,4], let=["A", "B", "A", "B"])
subset = data[(data[:num].>1)&(data[:let].=="B"),:]
所以我写了下面的宏
# Need to import SubstitutionString from Base
macro sel(dt, conditions)
dtstr=string(dt)
str = string(conditions)
out_str = replace(str, r":\w+",SubstitutionString(string(dtstr, "[", "\g<0>", "]")))
out_str = string(dtstr, "[", out_str, ",:]")
eval(parse(out_str))
end
这样我就可以写
subset = @sel data (:num.>1)&(:let.=="B")
这很好用,除非我想将列与 "Turtles::Leonardo" 或“12:25:00”等字符串匹配。有什么方法可以避免在此处将字符串的内容错误地识别为列名,或者这是这种草率的转换为字符串并在该元编程上工作的限制?
有帮助吗?
out_str = replace(str, r"(\()(:\w)",SubstitutionString(string(dtstr, "[", "\g<2>", "]")))
您还可以查看 DataFramesMeta
,您可以在其中找到一个类似的宏,它应该适用于您提到的有问题的情况。宏是这样工作的:
subset = @where(data, (:num.>1)&(:let.=="B"))
我很懒惰,厌倦了使用这样的代码(在 0.4 RC 上)在数据框中选择行:
using DataFrames
data = DataFrame(num=[1,2,3,4], let=["A", "B", "A", "B"])
subset = data[(data[:num].>1)&(data[:let].=="B"),:]
所以我写了下面的宏
# Need to import SubstitutionString from Base
macro sel(dt, conditions)
dtstr=string(dt)
str = string(conditions)
out_str = replace(str, r":\w+",SubstitutionString(string(dtstr, "[", "\g<0>", "]")))
out_str = string(dtstr, "[", out_str, ",:]")
eval(parse(out_str))
end
这样我就可以写
subset = @sel data (:num.>1)&(:let.=="B")
这很好用,除非我想将列与 "Turtles::Leonardo" 或“12:25:00”等字符串匹配。有什么方法可以避免在此处将字符串的内容错误地识别为列名,或者这是这种草率的转换为字符串并在该元编程上工作的限制?
有帮助吗?
out_str = replace(str, r"(\()(:\w)",SubstitutionString(string(dtstr, "[", "\g<2>", "]")))
您还可以查看 DataFramesMeta
,您可以在其中找到一个类似的宏,它应该适用于您提到的有问题的情况。宏是这样工作的:
subset = @where(data, (:num.>1)&(:let.=="B"))