是否可以将在用户定义的函数中创建的数据表放在全局环境中?
Posted
技术标签:
【中文标题】是否可以将在用户定义的函数中创建的数据表放在全局环境中?【英文标题】:Is it possible to put data tables created within user-defined function in the global environment? 【发布时间】:2016-03-25 01:18:11 【问题描述】:我正在创建一个用户定义的函数,它可以帮助我创建 20 多个数据表。但是,与不使用用户定义函数时不同,这些数据表不会在全局环境中创建。请参阅下面的示例代码。
library(data.table)
samplefunction <- function(f)
df=as.data.table(list(V1=c('a','a','b','c'),V2=c(1,2,3,4)))
df.a=df[V1==f]
df.a
samplefunction('a')
我只知道如果 df.a 在控制台窗口中输出 data.table 行,该功能是否有效,因为 df 和 df.a 数据表不会在全局环境中创建。我将无法以这种方式查看我的数据表。是否可以在全局环境中创建表?
【问题讨论】:
【参考方案1】:使用<<-
运算符而不是=
将df.a
分配为函数中的全局变量:
samplefunction <- function(f)
df=as.data.table(list(V1=c('a','a','b','c'),V2=c(1,2,3,4)))
df.a <<- df[V1==f]
samplefunction('a')
df.a
见https://stat.ethz.ch/R-manual/R-devel/library/base/html/assignOps.html
或者您可以让函数返回数据表列表并使用标准分配。
【讨论】:
【参考方案2】:我认为@Nat 的第二个答案是更好的选择:
samplefunction <- function(f)
df=as.data.table(list(V1=c('a','a','b','c'),V2=c(1,2,3,4)))
df.a=df[V1==f]
return(list("df"=df, "df.a"=df.a)
全局赋值可以覆盖全局环境中的对象,这通常是不好的。在这里修改函数后,就可以如下使用了:
myresults <- samplefunction(input)
# show df
myresults[["df"]]
# show df.a
myresults[["df.a"]]
【讨论】:
以上是关于是否可以将在用户定义的函数中创建的数据表放在全局环境中?的主要内容,如果未能解决你的问题,请参考以下文章
Django Annotate - 我可以将在 annotate 中创建的字段用于在 annotate 中创建的另一个字段吗?
如何使在 ddply 中创建的对象在函数外部可用(在全局环境中)?