昨天,同时加入一些时间地块的"从每个列表最理想选择一个元素"的问题,我再一次想起了mathgroup发布我几年前做的("再生一个情节后保持情节注释").
当我认为某些轴标签会很好时,我很高兴地(手动)注释我的情节.问题是,使用轴标签重新生成图将会破坏您的手动注释.
看起来您可以在名为pic的图中找到用户添加内容:Rest[pic[[1, 1]]],因此,如果您将图重新生成为pic2,则可以使用以下内容获取注释:
Insert[pic2, Rest[pic[[1, 1]]], {1, 1}]
Run Code Online (Sandbox Code Playgroud)
我记得David Park(演示文稿包的作者)强烈反对手动注释.我自己做了一些程序化标签,但有时候在程序控制下放置标签太难了,就像这里一样(注意我不太喜欢PlotLegends,特别是因为有些颜色彼此接近):

扔掉原点的原因已经太晚了,但我不知道目前对这个问题的看法是什么.
BTW我的数学组发布中的技巧与上面显示的技巧略有不同,并且在前10个图中使用.但原则是一样的.
编辑
我将代码放置在Mathematica Toolbag中制作如上所示的SO数据图.
编辑
现在代码被Brett Champion转移到更合适的问题:如何从Mathematica访问StackOverflow API
我需要在一个大的Mathematica代码库(数十万行代码)上做一些元编程,并且不想编写一个完整的解析器,所以我想知道如何最好地从Mathematica笔记本中获取代码用一种易于解析的语法.
是否可以在FullForm语法中导出Mathematica笔记本,或者在语法中保存所有定义FullForm?
该文档的Save说,它可以在唯一的出口InputForm语法,这是不平凡的解析.
到目前为止,我所拥有的最佳解决方案是评估笔记本,然后使用DownValues参数提取重写规则(但这会错过符号定义),如下所示:
DVs[_] := {}
DVs[s_Symbol] := DownValues[s]
stream = OpenWrite["FullForm.m"];
WriteString[stream,
DVs[Symbol[#]] & /@ Names["Global`*"] // Flatten // FullForm];
Close[stream];
Run Code Online (Sandbox Code Playgroud)
到目前为止,我尝试了各种方法,但没有一种方法效果很好.Mathematica中的元编程似乎非常困难,因为它一直在评估我想要保持不被评估的事物.例如,我想获取无穷大符号的字符串名称,SymbolName[Infinity]但是将Infinity得到的值计算为非符号,并且调用SymbolName带有错误的die.因此,我希望用更合适的语言进行元编程.
编辑
最好的解决方案似乎是手动将笔记本保存为包(.m)文件,然后使用以下代码进行翻译:
stream = OpenWrite["EverythingFullForm.m"];
WriteString[stream, Import["Everything.m", "HeldExpressions"] // FullForm];
Close[stream];
Run Code Online (Sandbox Code Playgroud) 在以前的线程的有效方式删除空列表({}从列表)建议:
Replace[expr, x_List :> DeleteCases[x, {}], {0, Infinity}]
Run Code Online (Sandbox Code Playgroud)
使用Trott-Strzebonski就地评估技术,这种方法可以推广用于同时使用保持的表达式:
f1[expr_] :=
Replace[expr,
x_List :> With[{eval = DeleteCases[x, {}]}, eval /; True], {0, Infinity}]
Run Code Online (Sandbox Code Playgroud)
此解决方案比基于以下方案的解决方案更有效ReplaceRepeated:
f2[expr_] := expr //. {left___, {}, right___} :> {left, right}
Run Code Online (Sandbox Code Playgroud)
但它有一个缺点:如果它们被包装,它会对持有的表达式进行求值List:
In[20]:= f1[Hold[{{}, 1 + 1}]]
Out[20]= Hold[{2}]
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:在{}不评估保持表达式的情况下从列表中删除所有空列表()的最有效方法是什么?只有当它是另一个自身的元素时,才List[]应删除空对象.List
以下是一些时间安排:
In[76]:= expr = Tuples[Tuples[{{}, {}}, 3], 4];
First@Timing[#[expr]] & /@ {f1, f2, f3}
pl = Plot3D[Sin[x y], {x, …Run Code Online (Sandbox Code Playgroud)