【问题标题】:how to provide output of user-defined-function as data.frame in R in .GlobalEnv如何在 .GlobalEnv 中的 R 中将用户定义函数的输出作为 data.frame 提供
【发布时间】:2013-03-17 10:55:11
【问题描述】:

我创建了一个函数“mywsobj”,它接受一个输入和两个输出

用户输入:环境

output1:data.frame 名称“wsobj” (对象列表的数据、它们的类、它们的内存使用情况) 输出到控制台 output2:对象列表的条形图及其内存使用情况。

到目前为止一切正常,

我的问题1:但是如何在用户指定的输入环境中或至少在 .GlobalEnv 中从函数内部保存“wsobj” data.frame? 我尝试阅读以下内容:

我的问题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))   

【问题讨论】:

  • 请注意,如果您在希望提交给 CRAN 的包中执行此操作,这将是一个问题,因为此政策:“包不应修改全局环境(用户的工作区)。”
  • 非常感谢这个指针,我的下一个计划是,如果内存使用量超出预先指定的限制,我是否可以为用户生成系统(OS)警报,这是允许的吗?
  • 为什么要将对象保存在用户环境中?这通常是糟糕的设计。

标签: r user-defined-functions rstudio rstudio-server


【解决方案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

【讨论】:

  • @Arun,我刚刚打勾..其实我是新手
  • @purnendumaity,是的,我意识到了。这就是我留下评论的原因。如果您也接受其他问题的答案,如果您发现它回答了您的问题,那就太好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 2022-01-19
  • 2010-10-09
相关资源
最近更新 更多