当使用 Symbol("x") 表达式从 DataFrame 中选择时,DataFramesMeta.js 中的表达式格式错误
Malformed expression in DataFramesMeta.js when @selecting from DataFrame using a Symbol("x") expression
我有一个 Julia DataFrame,我可以正常使用它。例如,假设 df 是
df = DataFrame(:x => [1,2,3], :y => [4,5,6], :z => [7,8,9]);
我可以轻松做到
julia> df[:, :x]
3-element Vector{Int64}:
1
2
3
julia> df[:, [:x, Symbol("y")]]
3×2 DataFrame
Row │ x y
│ Int64 Int64
─────┼──────────────
1 │ 1 4
2 │ 2 5
3 │ 3 6
但是,如果我执行以下操作,则会出现严重错误。
julia> @select(df, Symbol("y"))
ERROR: LoadError: ArgumentError: Malformed expression in DataFramesMeta.jl macro
Stacktrace:
[1] fun_to_vec(ex::Expr; gensym_names::Bool, outer_flags::NamedTuple{(Symbol("@byrow"), Symbol("@passmissing"), Symbol("@astable")), Tuple{Base.RefValue{Bool}, Base.RefValue{Bool}, Base.RefValue{Bool}}}, no_dest::Bool)
@ DataFramesMeta ~/.julia/packages/DataFramesMeta/yzaoq/src/parsing.jl:289
[2] (::DataFramesMeta.var"#47#48"{NamedTuple{(Symbol("@byrow"), Symbol("@passmissing"), Symbol("@astable")), Tuple{Base.RefValue{Bool}, Base.RefValue{Bool}, Base.RefValue{Bool}}}})(ex::Expr)
@ DataFramesMeta ./none:0
[3] iterate(::Base.Generator{Vector{Any}, DataFramesMeta.var"#47#48"{NamedTuple{(Symbol("@byrow"), Symbol("@passmissing"), Symbol("@astable")), Tuple{Base.RefValue{Bool}, Base.RefValue{Bool}, Base.RefValue{Bool}}}}})
@ Base ./generator.jl:47
[4] select_helper(x::Symbol, args::Expr)
@ DataFramesMeta ~/.julia/packages/DataFramesMeta/yzaoq/src/macros.jl:1440
[5] var"@select"(__source__::LineNumberNode, __module__::Module, x::Any, args::Vararg{Any})
@ DataFramesMeta ~/.julia/packages/DataFramesMeta/yzaoq/src/macros.jl:1543
in expression starting at REPL[35]:1
有什么线索吗?
如果你希望对 Symbol
构造函数的调用被逐字解析,你需要使用 $
:
来转义它
julia> @select(df, $(Symbol("y")))
3×1 DataFrame
Row │ y
│ Int64
─────┼───────
1 │ 4
2 │ 5
3 │ 6
有关更多示例,请参阅 https://juliadata.github.io/DataFramesMeta.jl/stable/#dollar。
之所以需要这样做是因为 DataFramesMeta.jl 引入了非标准评估,因此如果您希望以标准方式评估事物,则需要转义它们。
我有一个 Julia DataFrame,我可以正常使用它。例如,假设 df 是
df = DataFrame(:x => [1,2,3], :y => [4,5,6], :z => [7,8,9]);
我可以轻松做到
julia> df[:, :x]
3-element Vector{Int64}:
1
2
3
julia> df[:, [:x, Symbol("y")]]
3×2 DataFrame
Row │ x y
│ Int64 Int64
─────┼──────────────
1 │ 1 4
2 │ 2 5
3 │ 3 6
但是,如果我执行以下操作,则会出现严重错误。
julia> @select(df, Symbol("y"))
ERROR: LoadError: ArgumentError: Malformed expression in DataFramesMeta.jl macro
Stacktrace:
[1] fun_to_vec(ex::Expr; gensym_names::Bool, outer_flags::NamedTuple{(Symbol("@byrow"), Symbol("@passmissing"), Symbol("@astable")), Tuple{Base.RefValue{Bool}, Base.RefValue{Bool}, Base.RefValue{Bool}}}, no_dest::Bool)
@ DataFramesMeta ~/.julia/packages/DataFramesMeta/yzaoq/src/parsing.jl:289
[2] (::DataFramesMeta.var"#47#48"{NamedTuple{(Symbol("@byrow"), Symbol("@passmissing"), Symbol("@astable")), Tuple{Base.RefValue{Bool}, Base.RefValue{Bool}, Base.RefValue{Bool}}}})(ex::Expr)
@ DataFramesMeta ./none:0
[3] iterate(::Base.Generator{Vector{Any}, DataFramesMeta.var"#47#48"{NamedTuple{(Symbol("@byrow"), Symbol("@passmissing"), Symbol("@astable")), Tuple{Base.RefValue{Bool}, Base.RefValue{Bool}, Base.RefValue{Bool}}}}})
@ Base ./generator.jl:47
[4] select_helper(x::Symbol, args::Expr)
@ DataFramesMeta ~/.julia/packages/DataFramesMeta/yzaoq/src/macros.jl:1440
[5] var"@select"(__source__::LineNumberNode, __module__::Module, x::Any, args::Vararg{Any})
@ DataFramesMeta ~/.julia/packages/DataFramesMeta/yzaoq/src/macros.jl:1543
in expression starting at REPL[35]:1
有什么线索吗?
如果你希望对 Symbol
构造函数的调用被逐字解析,你需要使用 $
:
julia> @select(df, $(Symbol("y")))
3×1 DataFrame
Row │ y
│ Int64
─────┼───────
1 │ 4
2 │ 5
3 │ 6
有关更多示例,请参阅 https://juliadata.github.io/DataFramesMeta.jl/stable/#dollar。
之所以需要这样做是因为 DataFramesMeta.jl 引入了非标准评估,因此如果您希望以标准方式评估事物,则需要转义它们。