R语言中的变量冲突问题

3

我有一个R脚本,它使用其他R脚本并以某种方式操作它们,并执行它们的代码。我的脚本使用一些变量(显然),当其他脚本使用相同的变量名称时,我会陷入混乱。我希望我可以像在胶囊中一样执行其他脚本,这样重叠的变量就不会互相影响。

我一直在研究环境,并进行了很多尝试,但是我没有理解它们的真正含义。

示例:

script1.txt
___________
i=sample(10:20,1)

script2.txt
___________
i=sample(10:20,1) 

myscript.txt
___________
other.script = c("script1.txt", "script2.txt")
for( i in 1:2 ) {
    source(other.script[i])
}
i==2

我希望每个变量“i”都能尽职尽责,而不影响其他变量(特别是在我的脚本中的那个变量,我不太关心其他变量)。

你能不能使用另一个变量,比如j?如果你描述一下你的设置和你想要做什么,可能会更有帮助。 - Tyler Rinker
2
@TylerRinker,依赖于变量名不同可能会很棘手,如果你的脚本变得太大就很难做到正确。将抽象化为函数可以确保变量局限于函数范围内,从而预防任何不需要的交互。 - Paul Hiemstra
2个回答

6

您正在寻找 sys.source。您已在正确的方向上,您需要创建一个 环境,然后在该环境内运行脚本。

other.script = c("script1.txt", "script2.txt")
for( i in 1:2 ) {
  env<-new.env(parent = baseenv())
  sys.source(other.script[i],env)
  print(get('i',env)) # prints the value of i
}
i==2 # TRUE

1
+1,虽然在自己的环境中执行脚本并检索结果以供稍后在脚本中使用听起来非常接近函数的概念。 - Paul Hiemstra
是的,我同意。然而,我可以想到一些情况下这会很有用。想象一下你给一个班级布置了一些作业,并告诉他们将答案存储在某个最终变量中。您将收集所有提交的文件,然后依次尝试运行每个文件。虽然有点牵强,但这并非完全不可能的用例。 - nograpes
1
我完全同意可能会有使用情况,但我通常会尽量避免它。 - Paul Hiemstra

6
最好的解决方法是创建一组函数,将脚本捕获的功能分解开来。每个函数在自己的环境中执行,防止变量互相干扰。理想情况下,函数不应太长,例如10-20行代码。然后,更大的脚本调用这些函数来完成任务。如果正确使用,您的脚本可以简短明了。我通常将这些函数存储在一个或多个脚本文件中,以供需要它们的脚本使用。甚至可以将它们包装成一个包。
按照您希望对脚本进行排序的方式,所有变量都是全局的,即在整个程序中都可以访问。通常应避免使用全局变量。这正是您问题的焦点:如何防止变量相互干扰。正如我所说,将其抽象为函数或对象是保持这种情况不发生的方法。有关全局变量等更多信息,请参见以下链接:

+1 - 有关不使用全局变量的建议。 - flodel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接