【问题标题】:Strategies for using functions to store within the global env使用函数在全局环境中存储的策略
【发布时间】:2019-06-27 00:11:49
【问题描述】:

假设我们有以下数据框:

# Data
Id <- c(1,2,3,4,5,6,7,8,9,10)
Type <- c("Beginner", "Expert", "Intermediate", "Beginner", 
  "Professional", "Expert", "Intermediate", "Professional", 
  "Professional", "Expert")
Response<- c(1,1,2,2,1,2,1,2,1,1)
Successful <- data.frame(Id, Type, Response)
Successful

# Dataframe
#   Successful
Id  Type             Response    
1   Beginner         1
2   Expert           1
3   Intermediate     2
4   Beginner         2
5   Professional     1
6   Expert           2
7   Intermediate     1
8   Professional     2
9   Professional     1
10  Expert           1

我知道我可以通过执行以下操作将其作为对象 (DFRespType) 存储在全局环境中:

 DFRespType <- 
  as.data.frame(round(100*prop.table(table(Successful$Response, 
                                   Successful$Type),2), 1))

但是,相反,我想创建一个用于存储对象的函数,以提高执行此操作的效率。下面我尝试制作StoreDF函数:

StoreDF <- function(DFName, dataset, variable1, variable2){
  DFName <- as.data.frame(round(100*prop.table(table(dataset$variable1, 
                                              dataset$variable2),2), 1))
}

但是当我尝试按以下方式使用它时,什么都没有存储:

StoreDF(DFRespType, Successful, Response, Type)

对此的任何帮助将不胜感激。

【问题讨论】:

  • StoreDF() 函数定义中尝试使用&lt;&lt;- 运算符而不是&lt;-。因此,DFName &lt;- as.data.frame(some_table) 变为 DFName &lt;&lt;- as.data.frame(some_table)
  • 这是对函数的误用。您正试图通过副作用产生一个对象。不要这样做。您可能想研究在列表中存储多个 data.frames。看到这个帖子:make list of data.frames.

标签: r function plot global store


【解决方案1】:

不要从函数内部将对象存储在全局环境中。而是从函数返回数据帧。还使用带引号的变量来子集数据框。

StoreDF <- function(dataset, variable1, variable2){
    as.data.frame(round(100* prop.table(table(dataset[[variable1]], 
                        dataset[[variable2]]),2), 1))
}

DFRespType <- StoreDF(Successful, "Response", "Type")
DFRespType

#  Var1         Var2 Freq
#1    1     Beginner 50.0
#2    2     Beginner 50.0
#3    1       Expert 66.7
#4    2       Expert 33.3
#5    1 Intermediate 50.0
#6    2 Intermediate 50.0
#7    1 Professional 66.7
#8    2 Professional 33.3

【讨论】:

  • 感谢 Ronak,这很好用。你能解释为什么对象不应该从函数内部存储在全局环境中吗?为什么你使用双方括号而不是单方括号?
  • @interestedindata 如果要在全局环境中存储函数内部的对象,则必须使用assign&lt;&lt;-,但使用assign&lt;&lt;- 通常不是一个好习惯。阅读Why is using assign badwhen to use <<-。除了那个双括号给你一个向量,而单括号给你一个数据框。检查mtcars[["cyl"]]mtcars["cyl"]。也许在这种情况下,这并不重要。
猜你喜欢
  • 1970-01-01
  • 2016-09-30
  • 2017-05-26
  • 2018-02-16
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多