使用transformBy()的R(统计)作用域错误,doBy包的一部分

使用transformBy()的R(统计)作用域错误,doBy包的一部分,r,statistics,R,Statistics,我想我在使用transformBy()时遇到了一个范围错误,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(

我想我在使用transformBy()时遇到了一个范围错误,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

    • 这是一个以多种方式提出的问题。显然,R中的范围界定发生了一些奇怪的事情

      编辑:不是R中的作用域与我天真地期望的不同,而是transformBy()中的作用域。见埃里克的答案

      我通过在全局环境中分配一个临时环境来解决这个问题,比如:

      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)
       }
      
      transformData=函数(数据){
      
      TimeTyEnv

      我认为这是代码中的一个bug,转换为函数。如果你查看<代码>源代码转换> < /C> >,它创建一个子函数名为<代码> Turras2,它在父文件的上下文中首先对数据框中的最后一个参数进行评估。作为封闭环境。然后在

      transform2
      上调用
      lappy


      由于R使用词法范围语义(请参阅),有效的范围层次结构是
      data
      然后
      lappy
      然后是global。我认为正确的解决方法是添加一个
      pf形式的语句,这在?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”的一部分,然后 它将按照您的预期工作。当前函数正在尝试
      在“data”data.frame中计算“five”,这当然会失败。

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