错误:我的代码中出现意外的符号/输入/字符串常量/数字常量/SPECIAL

Error: unexpected symbol/input/string constant/numeric constant/SPECIAL in my code

提问人:Richie Cotton 提问时间:9/17/2014 最后编辑:Richie Cotton 更新时间:4/1/2023 访问量:385319

问:

我收到了其中一个错误。

Error: unexpected symbol in "<my code>"    
Error: unexpected input in "<my code>"
Error: unexpected string constant in "<my code>"  
Error: unexpected numeric constant in "<my code>"   
Error: unexpected SPECIAL in "<my code>"         
Error: unexpected '<some punctuation>' in "<my code>" 
Error: unexpected '<reserved word>' in "<my code>"        

该错误是什么意思,我该如何解决?

重现错误的一些简单示例和常见变体:

a a
## Error: unexpected symbol in "a a"
a\
## Error: unexpected input in "a\"
a""
## Error: unexpected string constant in "a"""
""1
## Error: unexpected numeric constant in """1"
%%
## Error: unexpected SPECIAL in "%%"
,
## Error: unexpected ',' in ","
=
## Error: unexpected '=' in "="
)
## Error: unexpected ')' in ")"
else
## Error: unexpected 'else' in "else"
R-常见问题

评论

4赞 hrbrmstr 9/17/2014
他们可以阻止相当多的骗子。对FAQ的很好的补充,Richie。
2赞 Carl Witthoft 9/17/2014
虽然广泛的答案列表很好,但“选择重载”问题实际上可能会让用户离开。你有没有机会减少到10个或更少的链接,覆盖99%的错误?
1赞 Richie Cotton 9/17/2014
如果每个阅读本文的人都点击几个链接,并投票关闭任何看起来质量低下的内容,那该怎么办?一旦垃圾被清除,我将减少这个链接列表。
0赞 Richie Cotton 9/17/2014
顺便说一句,链接在每个类别中按从旧到最新的顺序排列。
2赞 joran 9/18/2014
我不确定这在实践中有多大用处,但我认为这不是一个糟糕的主意。不过,我确实认为如果没有大量的链接列表,这个问题会好得多。(国际海事组织)

答:

77赞 7 revsRichie Cotton #1

这些错误意味着你尝试运行或源的 R 代码在语法上不正确。也就是说,你有一个错别字。

若要解决此问题,请仔细阅读错误消息。错误消息中提供的代码显示了 R 认为问题出在哪里。在原始代码中找到该行,并查找拼写错误。


防止您再次出错的预防措施

避免语法错误的最好方法是编写时尚的代码。这样,当您输入错误时,问题将更容易被发现。SO R 标记信息页面链接了许多 R 样式指南。还可以使用该包自动将代码格式化为更具可读性的内容。在 RStudio 中,键盘快捷键 + + 将重新设置代码格式。formatRCTRLSHIFTA

请考虑使用 IDE 或文本编辑器,突出显示匹配的括号和大括号,并以不同的颜色显示字符串和数字。


产生这些错误的常见语法错误

不匹配的括号、大括号或方括号

如果您有嵌套的括号、大括号或括号,则很容易将它们关闭太多或太少。

{}}
## Error: unexpected '}' in "{}}"
{{}} # OK

做乘法时丢失*

这是数学家经常犯的错误。

5x
Error: unexpected symbol in "5x"
5*x # OK

不将 if、for 或 return 值换行在括号中

这是MATLAB用户经常犯的错误。在 R 中,、等都是函数,因此需要将它们的内容括在括号中。ifforreturn

if x > 0 {}
## Error: unexpected symbol in "if x"
if(x > 0) {} # OK

不对代码使用多行代码

尝试在一行上编写多个表达式,而不用分号分隔它们会导致 R 失败,并使代码更难阅读。

x + 2 y * 3
## Error: unexpected symbol in "x + 2 y"
x + 2; y * 3 # OK

否则从新行开始

在 - 语句中,关键字必须与块的末尾出现在同一行。ifelseelseif

if(TRUE) 1
else 2
## Error: unexpected 'else' in "else"    
if(TRUE) 1 else 2 # OK
if(TRUE) 
{
  1
} else            # also OK
{
  2
}

= 而不是 ==

=用于赋值和为函数参数赋值。 测试两个值是否相等。==

if(x = 0) {}
## Error: unexpected '=' in "if(x ="    
if(x == 0) {} # OK

参数之间缺少逗号

调用函数时,每个参数必须用逗号分隔。

c(1 2)
## Error: unexpected numeric constant in "c(1 2"
c(1, 2) # OK

不引用文件路径

文件路径只是字符串。它们需要用双引号或单引号括起来。

path.expand(~)
## Error: unexpected ')' in "path.expand(~)"
path.expand("~") # OK

字符串内的引号

当尝试通过 传递带引号的值或创建带引号或查询时,这是一个常见问题。systemxPathsql

双引号字符串内的双引号需要转义。同样,单引号字符串内的单引号需要转义。或者,您可以在双引号字符串中使用单引号而不进行转义,反之亦然。

"x"y"
## Error: unexpected symbol in ""x"y"   
"x\"y" # OK
'x"y'  # OK  

使用大引号

对于R编程来说,所谓的“智能”引号并不那么智能。

path.expand(“~”)
## Error: unexpected input in "path.expand(“"    
path.expand("~") # OK

使用不带反引号的非标准变量名称

?make.names 描述了什么是有效的变量名。如果你创建一个无效的变量名称(也许使用),那么你需要用反引号来访问它,assign

assign("x y", 0)
x y
## Error: unexpected symbol in "x y"
`x y` # OK

这也适用于使用 创建的数据框中的列名。check.names = FALSE

dfr <- data.frame("x y" = 1:5, check.names = FALSE)
dfr$x y
## Error: unexpected symbol in "dfr$x y"
dfr[,"x y"] # OK
dfr$`x y`   # also OK

在将运算符和其他特殊值传递给函数时,它也适用。例如,在 上查找帮助。%in%

?%in%
## Error: unexpected SPECIAL in "?%in%"
?`%in%` # OK

获取非 R 代码

该函数从文件运行 R 代码。如果您尝试使用它来读取数据,它将中断。可能你想要 read.tablesource

source(textConnection("x y"))
## Error in source(textConnection("x y")) : 
##   textConnection("x y"):1:3: unexpected symbol
## 1: x y
##       ^

损坏的 RStudio 桌面文件

RStudio 用户报告了由于文件损坏而导致的错误源错误。这些报告仅在 2014 年 3 月左右发生,因此可能是特定版本的 IDE 存在问题。可以使用支持页面上的说明重置 RStudio。.rstudio-desktop


在数学绘图注释中使用不带粘贴的表达式

尝试在绘图中创建数学标签或标题时,创建的表达式必须是语法上有效的数学表达式,如 ?plotmath 页面上所述。否则,内容应包含在对粘贴的调用中。

plot(rnorm(10), ylab = expression(alpha ^ *)))
## Error: unexpected '*' in "plot(rnorm(10), ylab = expression(alpha ^ *"
plot(rnorm(10), ylab = expression(paste(alpha ^ phantom(0), "*"))) # OK

评论

0赞 Mark Neal 1/10/2022
获取此结果的一种非常常见的方法是复制代码。例如,从 R 博客复制代码时,通常会将“”格式化为不相同的语音标记,或者看起来像空格但实际上不是空格的空格字符。从谷歌快速链接复制时也会发生类似的事情,谷歌(不是这样)有帮助地将空格放入变量名称中(例如 成为。my.varmy. var
5赞 GDR 9/24/2018 #2

对我来说,错误是:

Error: unexpected input in "�"

修复方法是在十六进制编辑器中打开脚本并从文件中删除前 3 个字符。该文件以 UTF-8 BOM 开头,似乎 Rscript 无法读取它。

编辑:OP要求举个例子。开始了。

➜  ~ cat a.R
cat('hello world\n')
➜  ~ xxd a.R
00000000: efbb bf63 6174 2827 6865 6c6c 6f20 776f  ...cat('hello wo
00000010: 726c 645c 6e27 290a                      rld\n').
➜  ~ R -f a.R        

R version 3.4.4 (2018-03-15) -- "Someone to Lean On"
Copyright (C) 2018 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

  Natural language support but running in an English locale

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> cat('hello world\n')
Error: unexpected input in "�"
Execution halted

评论

0赞 Richie Cotton 10/12/2018
如果您提供一个可重现的示例,那将会很有帮助。您也可以将文件编码设置为解决方案吗?
0赞 GDR 10/25/2018
不确定我将如何提供可重现的示例。将 base64 编码的文件粘贴到此处,以免丢失特殊字符?粘贴十六进制转储?
0赞 Richie Cotton 10/30/2018
怎么样:用于创建包含违规内容的文件,然后通过 .或者也许是包裹。cat()Rscriptsystem()littler
3赞 Hayden 1/19/2021 #3

如果要将代码复制粘贴到 R 中,它有时不会接受某些特殊字符,例如“~”,而是显示为“ ”。因此,如果某个字符出现错误,请确保使用键盘输入该字符,或者如果不起作用,请找到另一个网站进行复制粘贴。