【问题标题】:R (statistical) scoping error using transformBy(), part of the doBy package使用 transformBy() 的 R(统计)范围错误,doBy 包的一部分
【发布时间】:2010-09-18 16:16:25
【问题描述】:

我认为我在使用 transformBy() 时遇到了范围错误,它是 R 的 doBy 包的一部分。下面是一个简单的问题示例:

> library(doBy)
>
> test.data = data.frame(
+  herp = c(1,2,3,4,5),
+  derp = c(2,3,1,3,5)
+ )
>
> transformData = function(data){
+ 
+  five = 5
+ 
+  transformBy(
+   ~ herp,
+   data=data,
+   sum=herp + derp + five
+  )
+ }
>
> transformData(test.data)
Error in eval(expr, envir, enclos) : object 'five' not found

当我在子范围(非全局范围)内运行 transformBy() 时,似乎没有局部变量或函数可用于 transformBy。另一方面,如果我在全局范围内定义这些变量或函数,它们就会变得可用。这是一个稍微修改后的有效示例:

> library(doBy)
>
> test.data = data.frame(
+  herp = c(1,2,3,4,5),
+  derp = c(2,3,1,3,5)
+ )
>
> five = 5
>
> transformData = function(data){
+  transformBy(
+   ~ herp,
+   data=data,
+   sum=herp + derp + five
+  )
+ }
>
> transformData(test.data)
  herp derp sum
1    1    2   8
2    2    3  10
3    3    1   9
4    4    3  12
5    5    5  15

我是否误解了 transformBy 应该如何工作或有什么问题?

版本:

  • ubuntu:8.04 (x64)
  • R:2.10.1
  • 执行:4.0.5

【问题讨论】:

  • 我不确定你到底想在这里做什么,但如果你只想添加列:test.data
  • @Brandon :见 ?transformBy。您的代码不等同于 OPs 问题

标签: r statistics


【解决方案1】:

这在 ?transformBy 帮助页面中有明确记录,因此 不是一个错误。

详情:

 The ... arguments are tagged vector expressions, which are
 evaluated in the data frame data. The tags are matched against
 names(data), and for those that match, the value replace the
 corresponding variable in data, and the others are appended to
 data.

只需将对象“五”作为 data.frame “数据”的一部分,然后 它会按您的预期工作。目前该功能正在尝试 评估“数据”data.frame 中的“五”,这当然会失败。

【讨论】:

    【解决方案2】:

    我认为这是transformBy 函数中的错误。如果您查看transformBy 的源代码,它会创建一个名为transform2 的子函数,它首先在数据帧的上下文中评估最后一个参数,其中 parent.frame() 作为封闭环境。然后它在transform2 上调用lapply

    由于 R 使用词法范围语义(参见 http://cran.r-project.org/doc/manuals/R-intro.html#Scope),有效范围层次结构是 data 然后是 lapply 然后是全局的。我认为正确的解决方法是在transform2 定义之外添加pf <- parent.frame() 形式的语句,然后在eval 语句中引用pf

    【讨论】:

      【解决方案3】:

      这是一个以多种方式提出的问题。 显然,R 中的作用域发生了一些奇怪的事情。

      edit : 与我天真的预期不同的不是 R 中的作用域,而是 transformBy() 的作用域。请参阅 Erik 的答案。

      我通过在全局环境中分配一个临时环境来解决它,例如:

      transformData = function(data){
      
        temp_env <<- new.env(hash=T) #hashed environment for easy access
        temp_env$five = 5
      
        out <- transformBy(
         ~ herp,
         data=data,
         sum=herp + derp + temp_env$five
        )
        rm(temp_env,envir=.GlobalEnv) # cleanup 
        return(out)
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-31
        • 1970-01-01
        • 2021-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多