R自动执行“意外符号”后面的代码 - 错误

时间:2017-07-27 15:08:06

标签: r

最近几个月,我发现在安装了R-Studio的Windows和unix R上都会出现非常烦人的行为。

发生错误后,R会自动执行它在产生错误的行后面找到的每个代码(此处:“意外符号”)。这是一个示例代码

vec1 <- c("Hallo", "World"

vec2 <- c(1,2,3)

print(vec2)

print(vec1)

在第一行:

vec1 <- c("Hallo", "World"

R缺少结束“)”。在错误地初始化之后,会发生这种情况:

vec1 <- c("Hallo", "World"
+           
+ vec2 <- c(1,2,3)
Error: unexpected symbol in:
"          
vec2"
> 
> print(vec2)
Error in print(vec2) : object 'vec2' not found
> 
> print(vec1)
Error in print(vec1) : object 'vec1' not found
> 

R显然确实试图寻找一个结束括号,找到一个,给出预期的“意外符号” - 错误,但不是停止它,而是尝试执行下一行(以及其他所有后续行)。 这个R-或R-Studio是否相关,我该如何阻止它呢?

编辑: 我应该根据评论澄清问题所在。我不打算这种行为,也不打算在我的代码中包含错误的行!

有时只会忘记添加括号,逗号等等,但仍然会初始化这样一行。然后 - 至少对我来说 - R有这种非常烦人的行为然后贯穿整个代码。这是一个真实的例子: enter image description here

稍后在相同的情况下,模型对象被写了,这非常烦人。

所以再一次,我不想让你纠正代码,我想知道为什么R表现得如同被摧毁以及如何阻止它。

3 个答案:

答案 0 :(得分:3)

听起来你期待R在发现错误时停止。毕竟,这就是像C和Java这样的传统编译语言。但R不是编译语言。每行代码按顺序解释。这是R的固有部分,与RStudio没有任何关系。在你的例子中,R很难找出对c()的调用结束的位置,因为你错过了右括号。

我发现一个RStudio功能可以防止这种特定类型的错误,它是自动格式化程序(CTRL-SHIFT-A)。格式化您提供的代码示例时,很明显,当您查看缩进时,某些内容不正确。

代码从此更改......

vec1 <- c("Hallo", "World"
vec2 <- c(1, 2, 3)
print(vec2)
print(vec1)

对此..

vec1 <- c("Hallo", "World"
          vec2 <- c(1, 2, 3)
          print(vec2)
          print(vec1)

底部的三行向右缩进的事实让我警告我可能错过了一个右括号。

一般

如果您的问题是关于更广泛的错误处理,您通常可以使用函数来防止R在遇到错误时继续。这不适用于你的例子,因为括号是错误的,但它给出了一个更广泛的问题的答案,即何时可以让R在遇到问题时停止。

让我们生成错误。

stop("This is an error")
print("The code keeps running!")

注意错误后第二行是如何运行的。现在让我们将该代码包装在一个函数中。

demo_function <- function() {
  stop("This is an error")
  print("The code keeps running!")
}

demo_function()

该函数抛出错误并停止执行。

出于这个原因,将高风险代码置于函数内是个好主意。使用您提供的示例,只要您尝试定义函数,R就会抛出错误,这可能会帮助您在开发过程的早期捕获错误。

答案 1 :(得分:0)

您必须在语法中添加一些逗号(',')和一些括号,请尝试:

> vec1 <- c("Hello", "World")     
> vec2 <- c(1,2,3)
> print(vec2)
> print(vec1)

它应该有用。

答案 2 :(得分:0)

根据R-Studio的客户支持,此行为与R-Studio相关,可以通过在全局选项 - >全局选项下取消“执行语句中的所有行”来停止。编辑 - &gt;执行。抱歉打扰。