为什么我要做“< - ”?我不能设计我的功能绕过那个?

时间:2017-01-11 03:42:09

标签: r

我不喜欢的一件事就是保存过程。由于我一直在开发,我有大的工作环境,当我保存时,我喜欢经常保存特定对象。对我来说最烦人的事情之一是保存过程可能会如此复杂。对象(一次最多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中使用tabbing autocomplete。 :(

所以,让我们说dat是    鲍勃&LT; -sample(SEQ(1,1000))

我的函数对我的对象进行排序

bob.sorter<-function(dat){

    dat<-sort(dat)

    return(dat)}

所以现在当我输入bob时,我想要继续保存bob 对我来说基本上相当于

dat<-cell.creator(dat)

我在这里错过了什么吗?

2 个答案:

答案 0 :(得分: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 ...

这是一个可怕的人。你未来的自我会憎恨你这样做。并且,任何其他必须使用你的代码的人也会在你每次走过时都会低声嘀咕嘀咕。

答案 1 :(得分: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