【问题标题】:Malformed expression in DataFramesMeta.js when @selecting from DataFrame using a Symbol("x") expression使用 Symbol("x") 表达式从 DataFrame 中 @selecting 时 DataFramesMeta.js 中的表达式格式错误
【发布时间】:2022-01-12 16:49:51
【问题描述】:

我有一个 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

有什么线索吗?

【问题讨论】:

    标签: julia symbols dataframes.jl dataframesmeta.jl


    【解决方案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 引入了非标准评估,因此如果您希望以标准方式评估事物,则需要对其进行转义。

    【讨论】:

    • 谢谢,完全错过了。
    • (这里是 DataFramesMeta 的维护者)。是的,Symbol 不会自动转义。请注意,您根本不需要转换为符号。您可以按原样使用$"y"
    猜你喜欢
    • 2015-11-10
    • 2016-06-02
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多