警告:这些都是菜鸟的问题,因为我对朱莉娅真的很陌生。
在R中,有一个非常“统一”的函数,可以用read.table()
导出(几乎)任何类型的对象。看来朱莉娅的情况要复杂一些。如果我理解得很好:
writedlm
导出,但并不总是用CSV.write
导出。相反,DataFrames总是可以用CSV.write
导出,但永远不能用writedlm
导出。这是正确的吗?因此,没有类似R's write.table()
意义上的“通用出口商”CSV.write
似乎还返回导出文件的名称。相反,writedlm
没有。这对我来说是个问题。实际上,我需要一种将DataFrame导出到不返回值的函数的CSV文件中的方法,即只具有副作用的函数,如writedlm
。朱莉娅有办法做到这一点吗?
编辑:要了解更多细节,我的问题是在CSV.write
之后,ans
指向导出文件的名称;而writedlm
的情况并非如此。这里和这里的插图。即使@Przemyslaw Szufel给出了这个想法,我也无法摆脱它。(这是一个很微妙的问题,但我实际上是在为Julia写一个emacs后端。这种不一致,例如在导出对象之后不知道ans
是nothing
还是文件名,会给这次冒险增加一些痛苦.-理想情况下,我只是希望CSV.write
能保持沉默。)谢谢!
发布于 2020-10-08 17:22:42
我从第二个问题开始,因为它很短。只需在行尾使用分号;
,就不会返回任何值!
CSV.write(file, table);
但是,如果您想确保ans
没有任何价值,请在最后添加nothing
:
CSV.write(file, table);nothing;
如果您需要,可以将其打包到一个函数中:
function my_write(file, table)
CSV.write(file, table)
nothing
end
或者,如果你想要一个单衬垫,把它包成一个灯笼:
julia> (() -> begin;CSV.write("file.csv", df);nothing;end)()
julia> ans == nothing
true
在每种情况下,都不会观察到副作用(返回值)。
第一个问题更棘手。用于将数据存储在文件中的可能格式显然需要依赖于数据的格式。对于Julia来说,最常见的选项包括(我从最普通的选项开始,在最具体的选项上结束):
serialize
命令序列化BSON.jl
包的二进制JSONJSON.jl
或稍新的JSON3.jl
包进行JSON (从今天起都是一个不错的选择)JSONTables.jl
DelimitedFiles
的Array
的CSV.jl
的DataFrame
的现在,特定包的选择将取决于您的目标是什么。串行化是一种致命的机制--速度最快,用途最广。任何对象都可以在尽可能短的时间内以这种方式存储。没有什么是没有成本的-当您更新Julia版本或您的包,您可能无法读取您的对象回来。因此,它是为短期存储而设计的。
其中一半是基于JSON的存储系统。基本上,一切都可以存储为JSON,以后可以用Julia或其他编程语言读取。基于文本的JSON也可以在一个简单的文本编辑器中打开。
最后,CSV.jl
和Serialization
可以分别用于表和数组。但是,将DataFrame
转换为Array
或将Array
转换为DataFrame
很容易。
julia> df = DataFrame(a=1:3, b=rand(3),c=["a","b","c"])
3×3 DataFrame
│ Row │ a │ b │ c │
│ │ Int64 │ Float64 │ String │
├─────┼───────┼──────────┼────────┤
│ 1 │ 1 │ 0.440796 │ a │
│ 2 │ 2 │ 0.44232 │ b │
│ 3 │ 3 │ 0.282064 │ c │
julia> Matrix(df)
3×3 Array{Any,2}:
1 0.440796 "a"
2 0.44232 "b"
3 0.282064 "c"
您可以看到,在这个过程中丢失的唯一东西是类型信息,如果您要通过DelimitedFiles
导出数据,那么类型信息就无关紧要了。
相反,转换也很简单:
julia> rand(3,3) |> Tables.table |> DataFrame
3×3 DataFrame
│ Row │ Column1 │ Column2 │ Column3 │
│ │ Float64 │ Float64 │ Float64 │
├─────┼──────────┼───────────┼──────────┤
│ 1 │ 0.326649 │ 0.0278134 │ 0.111221 │
│ 2 │ 0.769378 │ 0.996156 │ 0.237821 │
│ 3 │ 0.802094 │ 0.726497 │ 0.619013 │
总之,正如你所看到的,一切都可以用朱莉娅来完成。
https://stackoverflow.com/questions/64267362
复制相似问题