为什么此StatsPlot代码不适用于构造的符号



这段代码可以工作并生成一个漂亮的图表:

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了解更多解释。

最新更新