2013-03-17 41 views
0

提供用戶定義的函數的輸出作爲data.frame中R I已經創建了一個函數「mywsobj」這需要一個輸入& 2輸出如何在.GlobalEnv

用戶輸入:環境

OUTPUT1 :data.frame名稱「wsobj」 (對象列表的數據,它們的類,它們的內存使用情況) 輸出到控制檯 output2:基於對象列表和它們的內存使用情況的barplot。

到目前爲止一切ok,

我的問題1:但如何從函數中保存「wsobj」 data.frame在用戶指定的輸入環境,或者至少在.GlobalEnv? 我嘗試閱讀如下東西:使用< <,使用pos/parent.environment等 但事情遠遠超出了我。

我的問題2:是否可以在Rstudio服務器的R /特別指定項目特定/用戶特定環境?

雖然我在這裏的代碼可能並不重要還是它下面是:

# creating SOME data 
dfAtoZ<- data.frame(LETTERS) 
df1to1Cr <- data.frame(1:10000000) 
vec1to1Cr <- as.vector(1:10000000) 
mat1to1Cr <- as.matrix(1:10000000) 
set.seed<-10 
randvec<-runif(1000,min=-100,max=100) 
# creating MY function 
mywsobj<-function(myenvironmentName) 
{#step1 creating vector of object names 
wslist <- vector(length=length(ls(myenvironmentName))) 
for(i in 1:length(ls(myenvironmentName))) 
{wslist[i]<-ls(myenvironmentName)[i]} 
# wslist<-cbind(unlist(ls())) 
#step2 creating vector of object classes 
wsclass <- vector(length=length(wslist)) 
wsmemKb <- vector(mode="numeric",length=length(wslist)) 
for(i in 1:length(wslist)) 
{wsclass[i]<-class(get(wslist[i])) 
wsmemKb[i]<- object.size(get(wslist[i]))/1000*1024} 
#step4 combining them in a data.frame 
wobj<-data.frame(cbind(wslist,wsclass,wsmemKb)) 
# library(sqldf) 
# sqldf("pragma table_info(wobj)") shows col 3(wsmem) still non-numeric 
wobj[,3] <- as.numeric(as.character(wobj[,3])) 
# create data to return matrix of memory consumption 
objmemsize <- rev(sort(sapply(ls(envir=myenvironmentName), 
       function (object.name)object.size(get(object.name))/1000))) 
# draw bar plot 
barplot(objmemsize,main="Memory usage by object in myenvironment", 
      ylab="KiloByte", xlab="Variable name", 
      col=heat.colors(length(objmemsize))) 
# result <- sqldf("select * from wobj order by 1/wsmemKb") 
return(wobj) 
# return(data.frame(myenvironmentName,wobj)) 
# return(assign("myname",wobj,envir = .GlobalEnv)) 
# attach(wobj,pos=2,"wobj") 
return(barplot) 
} 
# use of mywsobj function 
mywsobj(.GlobalEnv) 
# saving output of mywsobj function 
output<-as.data.frame(mywsobj(.GlobalEnv)) 
+0

注意,這將是一個問題,如果你在你希望提交給CRAN,因爲這一政策的包做:「包不應該修改全球環境(用戶的工作區)。「 – 2013-03-17 16:06:23

+0

非常感謝這個指針,我的下一個計劃是如果我可以爲用戶生成一個系統(OS)警報,如果內存使用超出預先指定的限制,是否允許? – pmr 2013-03-17 16:37:21

+0

爲什麼要將對象保存在用戶的環境中?這通常是不好的設計。 – hadley 2013-03-18 01:39:43

回答

3

不知道這是否是你追求的。但是,您可以使用$將值分配給該環境。

my_fun <- function(in.env) { 
    # you may want to check if input argument is an environment 

    # do your computations 
    set.seed(45) 
    x <- sample(10) 
    y <- runif(10) 
    in.env$val <- sum(x*y) 
} 

my_fun(my.env <- new.env()) 
ls(my.env) 
[1] "val" 
my.env$val 
# [1] 22.30493 

另外,您還可以使用assign如下:

my_fun <- function(in.env) { 
    # you may want to check if input argument is an environment 

    # do your computations 
    set.seed(45) 
    x <- sample(10) 
    y <- runif(10) 
    assign("val", sum(x*y), envir=in.env) 
} 

# assign to global environment 
my_fun(globalenv()) 
> val 
# [1] 22.30493 

# assign to local environment, say, v 
v <- new.env() 
my_fun(v) 
> v$val 
# [1] 22.30493 
+0

+1非常乾淨回答 – 2013-03-17 14:26:02

+0

非常好..它完全解決了我的目的。 – pmr 2013-03-17 16:51:22

+0

@阿倫,我剛剛打勾..其實我是一個新手 – pmr 2013-03-17 17:38:14