如何在R会话之间使用fix()保留更改功能?

时间:2011-12-01 18:39:59

标签: r edit

如果我使用fix()编辑R v2.14.0的函数,则会话期间会应用这些修复。

例如,我可能会进行以下编辑,以便在hive plot中获得白色背景:

> library(HiveR)
> fix(plotHive)
... :%s/black/white/g
... :w
... :q
> plotHive(myHiveData)

然后我按照预期在蜂巢图中获得白色背景。

但是如果我退出并重新打开R,我已经丢失了这些更改,并且情节再次出现黑色背景。

如何保留我在R会话之间使用fix()进行的编辑?

修改

如果我source()修改了plotHive()函数,我会收到以下错误:

> modifiedPlotHive <- source("modifiedPlotHive.R")

Error in source("modifiedPlotHive.R") : 
  modifiedPlotHive.R:1160:1: unexpected '<'
1159: }
1160: <
      ^
In addition: Warning message:
In readLines(file) : incomplete final line found on 'modifiedPlotHive.R'

修改后的plotHive()函数的最后一行是:

<environment: namespace:HiveR>

如果我在source()之前删除此行,则该函数将不再有效。

3 个答案:

答案 0 :(得分:3)

对不起我错过了它,但最新版本的HiveR可以选择控制背景颜色(可在CRAN 0.2-1上获得)Bryan

答案 1 :(得分:2)

有几种选择:

  1. 在退出之前保存工作区,并在重新打开R时重新加载。
  2. 将修改后的函数保存到脚本文件并将其源代码:

    sink("modified_plotHive.r")
    plotHive
    sink()
    
  3. 在下一次会议中:

        plotHive <- source("modified_plotHive.r")
    

    HTH

答案 2 :(得分:2)

这是@joran引用的更安全的做你想要的方式。

sink/source对可以处理R代码文件。但是保存到文本文件然后在其他类型的对象中读回可以剥夺它们的重要属性,特别是那些与环境有关的属性。这就是你刚才所经历的。

save/load对以R自己的二进制格式存储对象,因此不太可能丢失附加到函数的重要信息/环境。

在这个例子中,我定义了ls的个人版本,它与基本功能的不同之处在于它默认列出以点/句点开头的对象:

my_ls <- ls
fix(my_ls)
# 1) On the first line, change 'all.names=FALSE' to 'all.names=TRUE'
# 2) Say "Yes", I want to save the changes
save("my_ls", file="my_ls.Rdata")

# Then, in a later session, test that it works
load("my_ls.Rdata")
.TrysToHide <- 99
my_ls()
# [1] ".TrysToHide" "my_ls"  

还有一点需要注意:为修改过的函数赋予自己的名称要清晰得多。要真正编辑打包的函数并保持更改,您需要编辑源并重新编译包。但是如果你这样做,请注意,因为你可能会破坏依赖它的其他打包函数的功能。