как обеспечить вывод определяемой пользователем функции как data.frame в R в .GlobalEnv

Я создал функцию mywsobj, которая принимает один вход и два выхода.

пользовательский ввод: среда

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

Пока все нормально,

Мой вопрос1: но как сохранить этот data.frame "wsobj" из функции в этой указанной пользователем среде ввода или, по крайней мере, в .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))   

person pmr    schedule 17.03.2013    source источник
comment
Обратите внимание, что это будет проблемой, если вы сделаете это в пакете, который вы хотите отправить в CRAN, из-за этой политики: пакеты не должны изменять глобальную среду (рабочее пространство пользователя).   -  person Joshua Ulrich    schedule 17.03.2013
comment
Очень благодарен за этот указатель, мой следующий план состоит в том, если я могу генерировать системное (ОС) предупреждение для пользователя, если использование памяти выходит за пределы заранее указанного предела, будет ли это допустимо?   -  person pmr    schedule 17.03.2013
comment
Почему вы хотите сохранить объект в среде пользователя? Это вообще плохой дизайн.   -  person hadley    schedule 18.03.2013


Ответы (1)


Не уверен, что это то, что вам нужно. Но вы можете присвоить значения этой среде с помощью $.

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
person Arun    schedule 17.03.2013
comment
@Арун, я только что поставил галочку... на самом деле я новичок - person pmr; 17.03.2013
comment
@purnendumaity, да, я поняла. Вот почему я оставил комментарий. Было бы здорово, если бы вы приняли ответы и на другие ваши вопросы, если вы найдете ответы на свои вопросы. - person Arun; 17.03.2013