2013-03-17 3 views
0

Я создал функцию «mywsobj», который принимает один входной & 2 Выхода входногокак обеспечить вывод определенного пользователя-функции, как data.frame в R в .GlobalEnv

пользователя: окружающая среда

output1 : имя data.frame "wsobj" (данные списка объектов, их классы, использование их памяти) вывод на консоль output2: штрих-лист списка объектов и использование их памяти.

До сих пор все нормально,

Мой Question1: Но как сохранить эту «wsobj» data.frame внутри функции в том, что указанный пользователем входной среды или, по крайней мере, в .GlobalEnv? Я пробовал читать такие вещи, как: использование < <, использование pos/parent.environment и т. Д. , но все так далеко от меня.

Мой вопрос2: Можно ли указать специфичную для проекта/пользовательскую спецификацию в R/специально на сервере Rstudio?

Хотя мой код здесь не имеет значения еще ниже:

# 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, из-за этой политики: «Пакеты не должен изменять глобальную среду (рабочее пространство пользователя). " –

+0

Очень благодарен за этот указатель, мой следующий план заключается в том, могу ли я генерировать системное (ОС) предупреждение для пользователя, если использование памяти выходит за пределы заданного предела, допустимо ли это? – pmr

+0

Почему вы хотите сохранить объект в пользовательской среде? Это вообще плохой дизайн. – hadley

ответ

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 Очень чистый ответ –

+0

Очень хорошо .. я решил свою цель точно. – pmr

+0

@Arun, я просто пометил..активно я новичок – pmr

 Смежные вопросы

  • Нет связанных вопросов^_^