【问题标题】:How to avoid parsing the contents of strings in a macro如何避免在宏中解析字符串的内容
【发布时间】:2015-09-28 17:37:39
【问题描述】:

我很懒,厌倦了用这样的代码在数据帧中选择行(在 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”等字符串匹配。有什么方法可以避免在这里错误地将字符串的内容识别为列名,或者这是这种草率的转换为字符串并在元编程上工作的限制?

【问题讨论】:

  • import Base.SubstitutionString ?请告诉我如何导入 SubstitutionString
  • 我应该提到 - 这仅适用于 0.4 - 看起来自 3.11 以来对替换进行了一些更改。

标签: macros dataframe metaprogramming julia


【解决方案1】:

您还可以查看DataFramesMeta,在那里您可以找到一个类似的宏,它应该适用于您提到的有问题的情况。宏是这样工作的:

subset = @where(data, (:num.>1)&(:let.=="B"))

【讨论】:

  • 这正是我想要的……只有更好。
【解决方案2】:

有帮助吗?

out_str = replace(str, r"(\()(:\w)",SubstitutionString(string(dtstr, "[", "\\g<2>", "]"))) 

【讨论】:

    猜你喜欢
    • 2016-04-24
    • 2011-04-05
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    相关资源
    最近更新 更多