r语言 - 全局变量作为函数参数



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

你能帮我吗,关于,什么是最佳实践:

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

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

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

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

在理想世界中,数据输入函数作为参数,并将其保留为返回值。这是一个很好的原则。此外,它更适合代码重用。现在你可能会被定罪,你只会在df上调用这段代码(顺便说一下,这个名字不好,因为 R 中已经有一个函数调用df,这可能会导致可怕的错误消息(。

此规则的唯一例外,以及<<-存在的原因(*(,可能很少是性能。

但是,在只读情况下,没有性能提升,因为 R 确实表现得很聪明。

Will 需要安装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

最新更新