2017-01-11 64 views
-1

我不喜欢的其中一件事是保存过程。由于我一直在发展,我有很大的工作环境,而当我救我时,经常要保存特定对象。对我来说最烦人的事情之一是保存过程可能非常复杂。对象(一次最多10个)是10到20个各种数据帧(从光栅化图像到中等和大数据帧)的列表,这些数据帧全部以不同的功能以不同的方式使用,其中可以变得非常复杂。为什么我必须做“< - ”?我能设计我的功能绕过吗?

其中之一,我一直无法弄清楚的事情是我的功能期间(如果我执行的东西,将改变数据),我想自动保存更改的对象回目录。而不是我必须做的事情如下。注意这可以通过for循环来处理对象列表,但我想为我输入到该函数的对象执行此操作。

# obtain the name of the object you will be inputing into 
# the function in character form 
dat.name<-ls(pattern="dat") 
#or select it from a list if there are multiple 
dat.name<-select.list(ls(pattern="dat")) 

# do the function with the object assign it to a new name just in case 
# something doesn't work 
tmp.dat<-cell.creator(dat) 

#next assign the tmp to the real 
assign(dat, tmp.dat) 

##or## just do the straight up rename if you are brave, 
#and i am starting to get pretty brave with some of my functions 
dat<-cell.creator(dat) 

#paste .rdata on the back to create a file name 
file.name<-paste(dat.name, ".rdata") 

#then... FINALLY save it 
save(dat, file=file.name) 

我真正想要做的是内在的命令进入功能,但(除非我不理解这一点)没有什么是存储在输入过程中我的对象命名方式,除非我输入它报价。这不允许我在rgui中使用tab键自动完成功能。 :(

所以,可以说是逸鲍勃 - 抽样<(SEQ(1,1000))

和我的函数对我的对象

bob.sorter<-function(dat){ 

    dat<-sort(dat) 

    return(dat)} 

所以,现在当我输入鲍勃,我想什么,只是继续前进,保存鲍勃 我基本上做

dat<-cell.creator(dat) 

我在这里失去了一些东西相当于?

+0

(a)用于一个科学家,再现似乎不为重; (b)该代码实际上没有对矢量进行排序; (c)如果你想在原地修改对象,使用C/C++。你可以在R中用'assign()'创建同样难以理解的(在未来的日子)副作用,但没有人会理解这一点。您可以使用IDE /编辑器片段/映射快捷方式删除“tedium”。 – hrbrmstr

+0

你认为重复性似乎并不重要?如果我正在做一个统计分析,我会去做一个脚本。如果我正在清理数据,准备二进制数据帧,并且/或者在学习环境中工作,那么每次我想要分析时,我都不能创建10000行脚本。 我不认为你了解我尝试使用的数据量。 – MadmanLee

+0

我每天都在处理大量非常多样化的数据(我从数十种每日全网扫描和网络研究互联网200个蜜罐)。黑客脚本是结束超级糟糕分析的好方法。 – hrbrmstr

回答

1

我不完全理解你的问题,但这似乎解决了它的一部分。以下是一个将对象分配给变量(例如bob)并将其自动保存到名称为变量名称的文件后跟.rdata(例如"bob.rdata")而不需要实际输入文件名的功能:

qsave <- function(dat){ 
    dat.name <- deparse(substitute(dat)) 
    file.name <- paste0(dat.name,".rdata") 
    save(list = dat.name, file=file.name) 
} 

要测试:

> bob <- islands 
> qsave(bob) 
> rm(bob) #bob is now gone 
> load("~/bob.rdata") #you can check that this restores bob 
+0

啊有趣。 depares究竟做什么? – MadmanLee

+0

在控制台中使用'?deparse'和'?substitute'来获取详细信息。最相关的部分(替代品的帮助)说:“替代品的典型用途是为数据集和图表创建信息标签。下面的myplot示例显示了该设施的简单使用,它使用函数deparse和substitute为绘图创建标签,这些标签是函数myplot的实际参数的字符串版本。“ –

1

可以做到这一点:

set.seed(1492) # reproducible science 

bob <- sample(1:1000, 500) # the actual way sample() shld be called 

str(bob) 
## int [1:500] 278 216 185 111 52 9 848 507 388 763 ... 
bob_sorter <- function(dat) { 
    dat <- dat[order(dat)] # actual sorting happening 
    dat 
} 

str(bob_sorter(bob)) 
## int [1:500] 3 6 7 8 9 10 11 13 14 17 ... 

bobs_silly_sorter <- function(dat) { 
    passed_in_name <- as.character(substitute(dat)) # pls never do this 
    dat <- dat[order(dat)] 
    assign(passed_in_name, dat, envir=.GlobalEnv) # pls never do this 
} 

str(bob) 
## int [1:500] 278 216 185 111 52 9 848 507 388 763 ... 

bobs_silly_sorter(bob) 

str(bob) 
## int [1:500] 3 6 7 8 9 10 11 13 14 17 ... 

这是horribad。你未来的自己会很讨厌你这样做。而且,任何其他需要使用代码的人最终还是会在你每次走过时都会低声咕ob着你。

+0

我在这里错过了什么?我不明白编程的基本部分吗?什么是set.seed?为什么你这么做太可怕了?我了解脚本的重要性和可重复的结果。但是,这与仅仅追踪我的功能来看看我做了什么有什么区别呢? – MadmanLee

+0

@MadmanLee有点礼貌从不伤害。 。 – Bg1850

+0

我真的只是想明白我错在哪里。 – MadmanLee

相关问题