我认为在使用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
最佳答案
?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中评估“五个”,这当然会失败。