在R项目中,我们有一个全局数据框df
,该全局数据框将在函数my_func()
中使用。数据框不会更改,但将用作“只读”表。
您能帮我什么是最佳实践:
将数据框包含在函数的参数中,如
my_func(df)
{
a <- df[1,2]
}
OR
不将其包含在参数中,只需在函数体中使用(读取)即可,如
my_func()
{
a <- df[1,2]
}
答案 0 :(得分:0)
在理想情况下,数据将函数作为参数输入,并将其保留为返回值。这是一个好原则。此外,它对于代码重用是可取的。现在,您可能会被定罪,因为您将永远只能在df
上调用此代码(不好意思,因为R中已经有一个函数调用df
,这可能会导致可怕的错误消息)。
此规则的唯一例外,以及<<-
存在(*)的原因可能很少是性能。
但是在只读情况下不会提高性能,因为R的行为确实很聪明。
将需要安装microbenchmark
软件包才能运行以下代码:
expl <- data.frame(a = rep("Hello world.", 1e8),
b = rep(1, 1e8))
fun1 <- function(dataframe) return(sum(dataframe$b))
fun2 <- function() return(sum(expl$b))
microbenchmark::microbenchmark(fun1(expl), fun2())
尝试一下,您会发现fun2
与fun1
相比并没有性能提升,即使数据帧的大小很大。
修改:
从我从下面的Konrad Rudolph的评论中学到的(*),<<-
在将数据提供给父级(不一定是全局名称空间)时很有用。即使不是严格按照以下主题进行阅读,也非常有趣:http://adv-r.had.co.nz/Functional-programming.html#mutable-state