我正在创建一个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()
,有没有办法做同样的事。
答案 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
只发送消息,并且不会因为这样做而使您的计算机着火。说真的,不要在全局环境中创建东西,将它们作为返回值返回。