الحصول على دولة من المتغيرات بعد حدوث خطأ في R

StackOverflow https://stackoverflow.com/questions/1412582

  •  06-07-2019
  •  | 
  •  

سؤال

ودعونا نقول لقد دعوت مجرد وظيفة، f، وحدث خطأ في مكان ما من وظيفة. أريد فقط أن تكون قادرة على التحقق من قيم المتغيرات المختلفة مباشرة قبل حدوث الخطأ.

لنفترض حدسي يقول لي انها الشوائب الصغيرة، لذلك أنا كسول جدا للاستخدام debug(f) وكسول جدا لادخال browser() في جزء من وظيفة حيث أعتقد أن الأمور تسير بشكل خاطئ. وأنا الآن كسول جدا للبدء في وضع البيانات print().

وهنا مثال:

x <- 1:5
y <- x + rnorm(length(x),0,1)
f <- function(x,y) {
  y <- c(y,1)
  lm(y~x)
}

ودعوة f(x,y) نحصل على الخطأ التالي:

Error in model.frame.default(formula = y ~ x, drop.unused.levels = TRUE) : 
  variable lengths differ (found for 'x')

في هذا المثال، أريد استيلاء على حالة البيئة قبل ما يسمى lm(). بهذه الطريقة يمكن أن أدعو x وy ونرى أن أطوالها مختلفة. (هذا المثال قد تكون بسيطة جدا، ولكن آمل أن يحصل على فكرة عبر.)

هل كانت مفيدة؟

المحلول

وكما أشار هنا ، هناك وسيلة سهلة طريقة للقيام بذلك، وأعتقد أن هذه الحيلة لديه القدرة على تغيير حياة الناس إلى الأفضل.

أولا، نسمي هذا:

options(error=recover)

والآن عندما ندعو f(x,y) سيكون لدينا خيار لاختيار بيئة للتعافي. هنا يمكنني اختيار الخيار 1، الذي يفتح المصحح، ويتيح لي اللعب حولها مع المتغيرات فقط قبل أن يتم استدعاء lm().

> f(x,y)
Error in model.frame.default(formula = y ~ x, drop.unused.levels = TRUE) : 
  variable lengths differ (found for 'x')

Enter a frame number, or 0 to exit   

1: f(x, y)
2: lm(y ~ x)
3: eval(mf, parent.frame())
4: eval(expr, envir, enclos)
5: model.frame(formula = y ~ x, drop.unused.levels = TRUE)
6: model.frame.default(formula = y ~ x, drop.unused.levels = TRUE)

Selection: 1
Called from: eval(expr, envir, enclos)
Browse[1]> x
[1] 1 2 3 4 5
Browse[1]> y
[1] 1.6591197 0.5939368 4.3371049 4.4754027 5.9862130 1.0000000

نصائح أخرى

ويمكنك أيضا أن مجرد استخدام وظيفة التصحيح ():

> debug(f)
> f(x,y)
debugging in: f(x, y)
debug: {
    y <- c(y, 1)
    lm(y ~ x)
}
Browse[1]> 
debug: y <- c(y, 1)
Browse[1]> x
[1] 1 2 3 4 5
Browse[1]> y
[1] 2.146553 2.610003 2.869081 2.758753 4.433881

وoptions(error=recover)

وربما يجيب على السؤال الأفضل. ومع ذلك، كنت أريد أن أذكر أداة التصحيح يدوية أخرى، traceback(). يدعو هذا الحق بعد وقوع خطأ في كثير من الأحيان ما يكفي لتحديد علة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top