Wolfram mathematica mathematica中的包导入问题
在mathematica中(我使用的是mma 5.0(估计很旧)),如果我键入以下内容作为一行:Wolfram mathematica mathematica中的包导入问题,wolfram-mathematica,Wolfram Mathematica,在mathematica中(我使用的是mma 5.0(估计很旧)),如果我键入以下内容作为一行: Needs["Graphics`Master`"]; Animate[Plot[Sin[n x], {x, 0, 2 Pi}, Axes -> False], {n, 1, 6, 1}] 然后我收到了很多错误/警告。但是如果我单独输入,它就可以正常工作了。如何使它在一个代码块中工作 谢谢 正如belisarius指出的,你现在的问题有点中心化。然而,这个问题在当前版本中仍然存在。例如 Nee
Needs["Graphics`Master`"]; Animate[Plot[Sin[n x], {x, 0, 2 Pi}, Axes -> False], {n, 1, 6, 1}]
然后我收到了很多错误/警告。但是如果我单独输入,它就可以正常工作了。如何使它在一个代码块中工作
谢谢 正如belisarius指出的,你现在的问题有点中心化。然而,这个问题在当前版本中仍然存在。例如
Needs["Combinatorica`"]
ToCycles[{3, 4, 1, 2}]
工作正常,而(在重新启动内核之后)
失败,错误如下:
“ToCycles::shdw:Symbol ToCycles
出现在多个上下文中
{combinatica`,Global`};定义
在上下文中,它可能是影子
或者被其他定义所遮蔽。”
用Mathematica的术语来说,“一行”不起作用的原因是Mathematica试图在计算需求之前解析行中的所有符号(这让我感到惊讶)。这将ToCycles
解析为Global`ToCycles
(从而在符号表中输入此符号),然后需要有机会加载combinatica`ToCycles
的定义并将combinatica
添加到。要使一行程序正常工作,必须使用ToCyles的全名
:
Needs["Combinatorica`"]; Combinatorica`ToCycles[{3, 4, 1, 2}]
要理解该错误,您需要知道Mathematica中的所有符号都具有上下文`name
的形式。上下文类似于许多其他语言中的名称空间。现在,如果符号(如ToCycles
)在没有上下文的情况下被引用,Mathematica将查看当前$ContextPath
中的上下文,并查看符号是否在这些上下文中定义。如果不是,则符号将在当前上下文中解析,$context
,该上下文在正常使用中为全局
。
加载包时,该包的符号将在包上下文中定义(例如,Combinatica
),当包完全加载时,此上下文将添加到$ContextPath
,以便您可以通过符号的短名称访问符号。
现在,您可以看到错误的含义:由于解析符号时,combinatica
尚未加载,ToCycles
解析为Global`ToCycles
。加载包后,Mathematica会检查所有短名称是否唯一,并发现在这种情况下,短名称ToCycles
现在在$ContextPath
上的两个上下文中定义,一个因此“隐藏”了另一个。要引用这些符号中的特定符号,必须使用全名,例如combinatica`ToCycles
要解决阴影冲突,只需删除不需要的符号:
Remove[Global`ToCycles]
不知道它的可读性如何,但希望它能有所帮助……您应该将需要[]
调用放在笔记本顶部的一个单独的块中,或者放在package.m文件的第一个单独的行中
内核读取整行代码并对其进行解析,包括在开始计算之前确定符号的上下文。为避免出现问题,请不要使用分号。在包中的每个语句后放置两个换行符。
特别是在开始打包[]
和/或需要[]
@Janus:如何使用combinatica'ToCycles?另外,如何解决在同一代码块中编写需求和ToCycles的问题?非常感谢!解释得很好!天真的1-liner不起作用,这有点令人惊讶。@Quang Li:它必须是Combinatica和ToCycles之间的一个“backtick”,但我花了一段时间才弄清楚如何在我的答案中输入一个字面上的backtick。现在应该可以了吧?还有,在我看到你的评论之前,我添加了正确的一行:)@Simon:谢谢!这也让我感到惊讶。一直认为分号和换行符是完全可以互换的…+10从来没有发生在我身上。。。只是因为我总是在一行中单独使用需求[]。。。很高兴知道为什么!
Remove[Global`ToCycles]