Julia中如何将Vector{Any}转为Vector{Symbol}解决rename!报错
解决Julia中vcat生成Vector{Any}转Vector{Symbol}的问题
你的问题根源在于:空推导式[Symbol("ZbarX$i") for i in []]的类型是Vector{Any}(空推导式默认会推断为Any类型),当它和其他Vector{Symbol}数组用vcat拼接时,最终结果会被统一为Vector{Any},而DataFrames.rename!要求第二个参数必须是Vector{Symbol}类型,因此触发了MethodError。
下面是几种实用的解决方法:
方法1:让vcat直接生成Vector{Symbol}
在vcat的第一个参数指定类型为Symbol[],同时把空推导式替换成直接的Symbol[](避免生成Any类型的空数组):
rename!(data_df, vcat(Symbol[], [Symbol("Zbar$i") for i in 1:3], Symbol[], [Symbol("X$i") for i in [1]], [:y,:y_pred]))
vcat会根据第一个参数的类型统一所有输入数组的类型,最终直接得到Vector{Symbol},无需额外转换。
方法2:转换已生成的Vector{Any}
如果你已经得到了Vector{Any}类型的数组,可以通过以下方式转换成Vector{Symbol}:
# 先得到原vcat结果 names_vec = vcat([Symbol("Zbar$i") for i in 1:3], [Symbol("ZbarX$i") for i in []], [Symbol("X$i") for i in [1]], [:y,:y_pred]) # 方式1:直接构造Symbol数组 rename!(data_df, Vector{Symbol}(names_vec)) # 方式2:用convert转换 rename!(data_df, convert(Vector{Symbol}, names_vec)) # 方式3:展开元素构造数组 rename!(data_df, Symbol[names_vec...])
由于数组内的元素本来就是Symbol类型,只是容器类型为Any,这几种方式都能快速完成类型转换。
方法3:修正空推导式的类型
给空推导式加上类型标注,让它直接生成Vector{Symbol}:
rename!(data_df, vcat([Symbol("Zbar$i") for i in 1:3], [Symbol("ZbarX$i")::Symbol for i in []], [Symbol("X$i") for i in [1]], [:y,:y_pred]))
推导式里的::Symbol会强制元素类型为Symbol,因此空推导式的结果就是Vector{Symbol},后续vcat的结果自然也是Vector{Symbol}。
内容的提问来源于stack exchange,提问作者Codorado
相关产品推荐
相关产品推荐

