这段代码可以工作并生成一个漂亮的图表:
using DataFrames, StatsPlots
df = DataFrame(A = rand(20), C = repeat([1,2,3, 4], inner = 5))
plt_dens1 = @df df density(
:A,
group = :C,
title = "This works"
)
如果Symbol参数构造如下,则类似的代码将不起作用。
asymb = Symbol("A")
csymb = Symbol("C")
plt_dens2 = @df df density(
asymb,
group = csymb,
title = "This doesn't work"
)
它生成一条错误消息,开头为:
"ERROR: MethodError: no method matching _extract_group_attributes(::Symbol, ::Symbol)" is generated."
下面的代码生成一个图表,就像上面的第一个一样:
plt_dens3 = @df df density(
df[:, Symbol("A")],
group = df[:, Symbol("C")],
title = "This also works"
)
然而,它有点麻烦。
问题:plt_dens2的代码为什么不起作用?有没有简单的方法来解决这个问题?
原因是@df
宏是为列名作为文字传递时的简单用例而设计的。
使用DataFramesMeta.jsl中的@with
而不是@df
,所有操作都将按预期进行:
using DataFramesMeta
@with df density(
$asymb,
group = $csymb,
title = "This doesn't work"
)
请注意,您需要在变量名前面加上$
以插入其值,请参见https://juliadata.github.io/DataFramesMeta.jl/stable/#dollar了解更多解释。