الحصول على دولة من المتغيرات بعد حدوث خطأ في R
سؤال
ودعونا نقول لقد دعوت مجرد وظيفة، 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()
. يدعو هذا الحق بعد وقوع خطأ في كثير من الأحيان ما يكفي لتحديد علة.