R语言中的变量冲突
Posted
技术标签:
【中文标题】R语言中的变量冲突【英文标题】:Conflict of variables in R language 【发布时间】:2012-09-26 21:15:15 【问题描述】:我有一个 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”在不影响其他变量的情况下履行其职责(特别是 myscript 中的那个,我不太关心其他变量)。
【问题讨论】:
你能用另一个变量像j吗?如果您描述您的设置以及您正在尝试做什么,可能会更有帮助? @TylerRinker 如果您的脚本变得太大,则依赖于不同的变量名称可能会很棘手。对函数的抽象确保变量是函数的本地变量,防止任何不必要的交互。 【参考方案1】:解决此问题的最佳方法是创建一组函数,这些函数可以分割脚本捕获的功能。每个函数都在自己的环境中执行,防止变量相互干扰。理想情况下,函数不应该太长,比如 10-20 行或代码。比调用这些函数完成任务更大的脚本。如果您正确地执行此操作,您的脚本可能会简短且切中要害。我通常将这些函数存储在一个或多个脚本文件中,准备好被需要它们的脚本source
ed。您甚至可以将它们包装在一个包裹中。
按照您希望对脚本排序的方式,所有变量都是全局变量,即可以在整个程序中访问。一般来说,应该像瘟疫一样避免使用全局变量。这正是因为您的问题关注的是:我如何防止变量相互干扰。就像我说的,抽象成函数或对象是防止这种情况发生的方法。有关全局变量等的更多信息,请参见:
Global and local variables in R Global variables in R【讨论】:
+1 - 可以说不使用全局变量。【参考方案2】:您正在寻找sys.source
。您走在正确的轨道上,您需要创建一个environment
,然后在该环境中运行脚本。
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,虽然在自己的环境中执行脚本并检索结果以供以后在脚本中使用听起来非常接近函数的概念。 是的,我同意。但是,我可以想到一些有用的情况。想象一下,你给一个班级分配了一些作业,并告诉他们将答案存储在某个 final 变量中。您会将所有提交的文件收集为文件,然后尝试依次运行每个提交。做作,我知道,但不是一个完全不可能的用例。 我完全同意它可能会有用例,但我通常会尽量避免它。以上是关于R语言中的变量冲突的主要内容,如果未能解决你的问题,请参考以下文章
R语言:利用caret包中的dummyVars函数进行虚拟变量处理
R语言实战应用精讲50篇(三十二)-R语言实现单变量时间序列(附R语言代码)
R语言使用Hmisc包的label函数为dataframe中的特定变量(数据列)添加变量标签(variable labels)