tryCatch for循环

时间:2019-02-18 16:38:19

标签: r for-loop try-catch

我在for循环中运行tryCatch语句时遇到问题。我想遍历数据帧(x中的每一行,如果在获取列k1中给定行的sqrt时出错,我希望sqrtd等于{{ 1}},如果不是错误,则为sqrt值。

下面是我尝试过的代码,但是每一行的新列"NULL"都有sqr,但是只有第二行应该是"NULL",因为一个人不能使用{{ 1}}。

"NULL"

2 个答案:

答案 0 :(得分:0)

JMisc的addCol似乎在整个列的data.frame中添加了一个值(文档混淆地将其称为“常数”)。在您的代码中,您将在第一次迭代后用新值替换现有列。

您所遇到的解决方案是避免for循环-实际上,data.frames实际上不应在循环内构建。而是使用R的向量化运算。如:

sqrt_or_null = function (x) {
    tryCatch(sqrt(x), error = function (e) "NULL")
}

p = mutate(x, sqr = lapply(k1, sqrt_or_null))

但是,这将为您留下一个列表列,这是data.frame中的笨拙数据类型。原因是给定的非列表列只能包含单一类型的值,但是您的函数将根据操作是否成功返回不同类型:numeric或{{ 1}}。

您可以投射结果:

character

...但是我建议考虑更好地表示失败值(例如p = mutate(x, sqr = as.character(lapply(k1, sqrt_or_null))) ),或者在执行此操作之前避免失败(例如,通过NA无效行)。

您的代码还有一个问题:filter的类型是k1,而不是factor。因此,对于每个值,它将失败。您将需要首先将因子值转换为数值,这需要两个步骤:转换为字符串,然后转换为数值:

numeric

答案 1 :(得分:0)

每个向量只能是一种类型(例如,数字,逻辑,字符)。如果尝试在向量分配中包括多个类型,则向量将被强制转换为可以处理输入的最广泛的类型。如果运行x$k1,则应注意,结果向量是字符串的字符向量(即"3" "a" "3" "4" "5")。这是因为"a"是一个字符串,因此整个向量x$k1被强制转换为字符。取该向量中任何元素的平方根都会产生错误,因此sqrtd总是被分配"NULL"