全局变量作为函数参数

时间:2020-06-16 10:19:37

标签: r dataframe global

在R项目中,我们有一个全局数据框df,该全局数据框将在函数my_func()中使用。数据框不会更改,但将用作“只读”表。

您能帮我什么是最佳实践:

  1. 将数据框包含在函数的参数中,如

    my_func(df)
    {
    a <- df[1,2]
    }
    

    OR

  2. 不将其包含在参数中,只需在函数体中使用(读取)即可,如

    my_func()
    {
    a <- df[1,2]
    }
    

1 个答案:

答案 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())

尝试一下,您会发现fun2fun1相比并没有性能提升,即使数据帧的大小很大。

修改

从我从下面的Konrad Rudolph的评论中学到的

(*),<<-在将数据提供给父级(不一定是全局名称空间)时很有用。即使不是严格按照以下主题进行阅读,也非常有趣:http://adv-r.had.co.nz/Functional-programming.html#mutable-state