R (статистическая) ошибка определения объема с использованием transformBy (), часть пакета doBy - PullRequest
3 голосов
/ 18 сентября 2010

Я думаю, что получаю ошибку определения области видимости при использовании transformBy (), части пакета doBy для R. Вот простой пример проблемы:

> 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
  • doBy: 4.0.5

Ответы [ 3 ]

2 голосов
/ 01 октября 2010

Я бы посчитал это ошибкой в ​​функции transformBy. Если вы посмотрите на источник transformBy, он создаст подфункцию transform2, которая сначала оценивает последний аргумент в контексте фрейма данных, с parent.frame () в качестве окружающей среды. Затем он вызывает lapply на transform2.

Поскольку R использует лексическую семантику определения области видимости (см. http://cran.r -project.org / doc / manual / R-intro.html # Scope ), эффективная иерархия области действия равна data, тогда lapply тогда глобальный. Я думаю, что правильным решением будет добавить оператор в форме pf <- parent.frame() вне определения transform2, а затем сослаться на pf в операторе eval.

2 голосов
/ 01 октября 2010

Это четко задокументировано на странице справки? 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, что, конечно, не получается.

2 голосов
/ 01 октября 2010

Эта проблема поднимается разными способами. Очевидно, что-то странное происходит с областью видимости в R.

edit: не область видимости в 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)
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...