将变量的 Julia REPL 输出作为字符串获取

ese*_*sel 6 string read-eval-print-loop julia

我希望获得像在 Julia REPL 中作为字符串打印一样的输出,而不是打印到 REPL。

考虑你有一个大矩阵x

x = rand(100, 100)
Run Code Online (Sandbox Code Playgroud)

在 REPL 中,x 以一种很好的方式显示。我想通过函数调用将此输出作为字符串获取(不是以黑客的方式)。我怎样才能做到这一点?

我尝试使用该函数repr来获取输出:

repr(x)
Run Code Online (Sandbox Code Playgroud)

这给出了一个非常长的字符串,包含所有数字并且使屏幕变得混乱。我尝试使用这个context论点。首先用钥匙displaysize

repr(x, context = :displaysize => (80,80))
Run Code Online (Sandbox Code Playgroud)

它没有任何效果。(?)我尝试使用密钥limit

repr(x, context = :limit => true)
Run Code Online (Sandbox Code Playgroud)

这给出的输出不再使屏幕混乱,但它看起来不如“正常”REPL 输出那么好。

我尝试了同样的print功能和IOContext

io = IOBuffer();
print(IOContext(io, :limit => true), x)
String(take!(io))
Run Code Online (Sandbox Code Playgroud)

这给出了与 相同的结果repr

Bog*_*ski 7

我想这就是你想要的:

\n
julia> x=rand(100,100);\n\njulia> io = IOBuffer();\n\njulia> show(IOContext(io, :limit => true, :displaysize => (10, 10)), "text/plain", x);\n\njulia> s = String(take!(io));\n\njulia> println(s)\n100\xc3\x97100 Array{Float64,2}:\n 0.150112  \xe2\x80\xa6  0.913\n 0.14348      0.598862\n 0.265236     0.378648\n \xe2\x8b\xae         \xe2\x8b\xb1\n 0.599803     0.778466\n 0.79655      0.725736\n\njulia> io = IOBuffer();\n\njulia> show(IOContext(io, :limit => true, :displaysize => (20, 40)), "text/plain", x);\n\njulia> s = String(take!(io));\n\njulia> println(s)\n100\xc3\x97100 Array{Float64,2}:\n 0.150112   0.998585  \xe2\x80\xa6  0.913\n 0.14348    0.754191     0.598862\n 0.265236   0.364718     0.378648\n 0.746999   0.436714     0.594933\n 0.247191   0.340162     0.126489\n 0.92214    0.518781  \xe2\x80\xa6  0.530581\n 0.483844   0.146089     0.14216\n 0.421205   0.401629     0.381202\n \xe2\x8b\xae                    \xe2\x8b\xb1\n 0.0944732  0.990715     0.132398\n 0.711658   0.958458     0.0849586\n 0.378591   0.518736  \xe2\x80\xa6  0.688399\n 0.77595    0.319994     0.667458\n 0.427935   0.375477     0.656718\n 0.599803   0.779445     0.778466\n 0.79655    0.939409     0.725736\n
Run Code Online (Sandbox Code Playgroud)\n

这里的两个关键点是:

\n
    \n
  • 你使用show并指定你想要使用的 MIME(我猜你想要"text/plain"REPL 中给出的;一般来说,例如在 Jupyter Notebook 中,内部 HTML 和 LaTeX 用于某些类型,例如,这就是我们在 DataFrames.jl 中显示DataFrame对象的方法)
  • \n
  • :displaysize您也应该一般设置,通常show从 获取 displaysize stdout,但如果您有自定义io,那么它不知道您可能想要显示多少行和列(当然,如果您喜欢,您可以坚持使用默认值:))
  • \n
\n