为什么在创建R包时不允许分配给globalenv?

时间:2015-04-30 11:01:02

标签: r package assign

我正在创建一个R包,我有一个函数返回一个对象,该对象的名称是通过传递的参数构造的。 我使用函数assign()来执行此操作,如下面的代码所示,它可以正常工作。

df <- data.frame(A = 1:10, B = 2:11, C = 5:14)

ot_test <- function(df, min){
  tmp <- colSums(df)
  tmp2 <- df[, tmp >= min]
  assign(paste0(deparse(substitute(df)), "_min_", min), tmp2, envir= .GlobalEnv)
}
ot_test(df,60)
ls()
[1] "df"        "df_min_60" "ot_test"

但是当我用devtools::check检查包裹时,我收到了消息。

Found the following assignments to the global environment:
File 'test/R/ottest.R':
assign(paste0(deparse(substitute(df)), "_min_", min), tmp2, envir = .GlobalEnv)

如果没有.GlobalEnv参数或没有使用函数assign(),有没有办法做同样的事。

1 个答案:

答案 0 :(得分:3)

在函数式编程环境中,它只是一个丑陋,糟糕的事情。

出了什么问题:

 df_min_60 = ot_test(df,60)

你的论点是你的方法可以省去一些打字,但它可以让你了解各种各样的错误和晦涩。

假设我想在函数中调用ot_test,可能在循环中。现在,我的全局工作空间中的df_min_60没有任何警告或显而易见的线索。哎呀,谢谢你。那我该怎么办?

ot_test(df, 60)
# now rename so I don't stomp on it
df_min_60.1 = df_min_60
results = domyloop(d1,d2,d3)

这意味着更多打字。

现在另一个想法。假设我想在数据帧列表上调用ot_test并列出结果列表。通常我会做类似的事情:

for(i in 1:10){res[[i]] = ot_test(data[[i]], 60)}

但是你的代码我不能。我必须这样做:

for(i in 1:10){d=data[[i]]; ot_test(d,60); res[[i]] = d_min_60)}

这是更多的打字。

要感谢devtools::check只发送消息,并且不会因为这样做而使您的计算机着火。说真的,不要在全局环境中创建东西,将它们作为返回值返回。