介绍R的常见错误和解决方法
1. 不匹配的括号、大括号、方括号或引号
2.使用未安装或加载的功能
3. 函数、变量、数据集、对象或包名称中的拼写错误
4. 函数中缺少、不正确或拼写错误的参数
5. 错误、不合适或不一致的数据类型
6.忘记ggplot2中的+号
7.=和==的误解
8.选择了未定义的列
9.导入或使用错误数据文件时出现问题
10. 使用 $ 运算符时出现的问题
$ 运算符对原子向量无效
“闭包”类型的对象不可子集化
警告
强制引入的 NA
删除了…包含非有限值的行(stat_bin())
介绍
如果您刚开始使用 R,您会经常在代码中遇到阻止其运行的错误。记得刚开始用R的时候,代码错误频发,差点放弃学习这门编程语言。我什至记得我曾几次回到 Excel 来完成我的分析,因为我找不到导致问题的原因。
幸运的是,尽管开始时很困难,我还是强迫自己继续下去。而今天,即使我几乎每次写 R 代码时仍然会遇到错误,但凭借经验和实践,修复它们所需的时间越来越少。如果您一开始也很挣扎,请放心,这很正常:每个人在学习一门新的编程语言时都会遇到一些挫折(不仅是 R 语言)。
在这篇文章中,我重点介绍了R 中 10 个最常见的错误以及如何修复它们。当然,错误取决于你的代码和你的分析,所以不可能涵盖所有错误(Google 做得比我好得多)。但是,我想重点介绍一些在学习 R 时经常出现的常见语法错误,有时可能需要很长时间才能解决这些错误,然后才能意识到解决方案就在我们眼前。
这个集合是基于我的个人经验和我的学生在我教R 时遇到的错误。这个列表并不详尽,请随时评论(在帖子末尾)你在使用 R 时经常遇到的错误。
对于每个错误,我都提供了示例和解决方案来修复它们。我还在帖子末尾提到了一些警告(严格来说,这不是错误)。
1. 不匹配的括号、大括号、方括号或引号
一个相当微不足道但仍然很常见的错误是缺少括号、大括号、方括号或引号。
这种类型的错误适用于许多编程语言。例如,在 R 中:
缺少右括号:
mean(c(1, 7, 13)
在“else”之前缺少大括号:
x <- 7 if(x > 10) { print("x > 10") else { print("x <= 10") } ## 缺少方括号: summary(ggplot2::diamonds[, "price") ## 第二个元素中缺少右引号: grp <- c("Group 1", "Group 2) grp
当代码是简单的基本代码时,这些错误很容易检测到,但当代码更复杂时,可能会变得更难发现,例如:
for (i in y) { for (j in x) { p <- ggboxplot(dat, x = colnames(dat[j]), y = colnames(dat[i]), color = colnames(dat[j]), legend = "none", palette = "npg", add = "jitter" ) print( p + stat_compare_means(aes(label = paste0(..method.., ", p-value = ", ..p.format..), method = method1, label.y = max(dat[, i], na.rm = TRUE) ) + stat_compare_means(comparisons = my_comparisons, method = method2, label = "p.format") ) }
值得庆幸的是,如果你使用RStudio,2当你打开一个小括号、大括号、方括号或引号时,会自动写上一个结束语。
请记住,在安装软件包时,你必须在软件包的名称周围使用(单或双)引号:
## NOT correct:install.packages(ggplot2)
Error in install.packages : object ‘ggplot2’ not found
## correct:install.packages("ggplot2")## also correct:install.packages("ggplot2")
解决办法
当然,解决方案是简单地将所有打开的小括号、大括号、方括号和引号与它们关闭的对应物相匹配.
mean(c(1, 7, 13))## [1] 7x <- 7if (x > 10) { print("x > 10")} else { print("x <= 10")}## [1] "x <= 10"summary(ggplot2::diamonds[, "price"])## price ## Min. : 326 ## 1st Qu.: 950 ## Median : 2401 ## Mean : 3933 ## 3rd Qu.: 5324 ## Max. :18823grp <- c("Group 1", "Group 2")grp## [1] "Group 1" "Group 2"
另外,请确保正确放置逗号:
不正确(逗号错位):
c("Group 1," "Group 2")
Error: unexpected string constant in "c(“Group 1,” “Group 2"”
也不正确(缺少逗号):
c("Group 1" "Group 2")
Error: unexpected string constant in "c(“Group 1” “Group 2"”
正确:
c("Group 1", "Group 2")
2. 使用一个未安装或未加载的功能(就是没有安装或者没有加载这个包)
如果你遇到以下错误: “Error in … : could not find function ‘…’”,例如:
这意味着你正试图使用属于一个尚未安装或加载的软件包的函数。
解决方法
为了解决这个错误,你必须安装这个包(如果它还没有安装),并分别用install.packages()和library()函数加载它:
## install package:install.packages("ggplot2")## load package:library(ggplot2)
如果你不确定这两个函数的用法,请看关于在R中安装和加载包的更多细节。
3. 函数、变量、数据集、对象或软件包名称中的错别字
另一个常见的错误是拼错了函数、变量、数据集、对象或包的名称,例如:
## 函数名称中的拼写错误:maen(c(1, 7, 13))
Error in maen(c(1, 7, 13)) : could not find function “maen”
## 变量名称中的拼写错误:summary(ggplot2::diamonds[, "detph"])
Error: Column detph
doesn’t exist
数据集名称中的拼写错误:
data <- data.frame( x = rnorm(10), y = rnorm(10))summary(dta[, 2])
Error in summary(dta[, 2]) : object ‘dta’ not found
对象名称拼写错误:
test <- c(1, 7, 13)mean(tset)
Error in mean(tset) : object ‘tset’ not found
程序包名称拼写错误:
library("tydiverse")
Error in library(“tydiverse”) : there is no package called ‘tydiverse’
解决方案:
确保您正确拼写了所有函数、变量、数据集、对象和包
请注意,R区分大小写;mean()被认为与R的mean()不同!
mean(c(1, 7, 13))## [1] 7summary(ggplot2::diamonds[, "depth"])## depth ## Min. :43.00 ## 1st Qu.:61.00 ## Median :61.80 ## Mean :61.75 ## 3rd Qu.:62.50 ## Max. :79.00data <- data.frame( x = rnorm(10), y = rnorm(10))data[, 2]## [1] 1.3048697 2.2866454 -1.3888607 -0.2787888 -0.1333213 0.6359504## [7] -0.2842529 -2.6564554 -2.4404669 1.3201133test <- c(1, 7, 13)mean(test)## [1] 7library(tidyverse)## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──## ✔ ggplot2 3.4.0 ✔ purrr 0.3.5 ## ✔ tibble 3.1.8 ✔ dplyr 1.0.10## ✔ tidyr 1.2.1 ✔ stringr 1.4.1 ## ✔ readr 2.1.3 ✔ forcats 0.5.2 ## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──## ✖ dplyr::filter() masks stats::filter()## ✖ dplyr::lag() masks stats::lag()
如果你确信你正确地拼写了一个对象、一个函数或一个数据集,但你仍然有一个错误,说明 “object ‘…’ is not found”,请确保你在调用对象/函数/数据集之前定义了它!
经常发生这样的情况:一个学生要求我到他的电脑前,因为他运行了与我完全相同的代码,但却不能使它工作。大多数时候,如果他的代码确实和我的一模一样,他只是在运行包含该对象/函数/数据集的代码之前没有执行该对象/函数/数据集。换句话说,他只是试图使用一个未定义的对象或变量。
记住,在R脚本中写代码(与控制台相反)并不意味着它被编译了。你实际上必须运行它(通过点击运行按钮或使用键盘上的快捷键),以便代码被执行并在以后使用。如果你还在纠结这个问题,请参阅R和RStudio的基础知识。
4. 函数中的参数缺失、不正确或拼写错误
大多数R函数需要参数。例如,rnorm()函数至少需要通过参数n指定的观察值的数量。
如果你没有指定必须的参数,或者错误地指定了一个参数,你的代码将无法运行。此外,如果你拼错了一个参数,结果可能不是你期望的那样:
缺少强制参数:
rnorm()
Error in rnorm() : argument “n” is missing, with no default
不正确的参数:
rnorm(n = 3, var = 1)
Error in rnorm(n = 3, var = 1) : unused argument (var = 1)
错误的参数:
mean(c(1, 7, 13, NA), narm = TRUE)## [1] NA
最后一段代码没有抛出错误,但结果却不是我们想要的。
解决方法:
为了解决这些错误,确保至少指定函数的所有强制性参数,而且是正确的参数:
在rnorm()中,除了观察数n之外,还可以指定标准差sd(而不是方差var)。
去除NA是用na.rm(而不是narm)完成的。
正确的示范
rnorm(n = 3, sd = 1)## [1] -0.3066386 -1.7813084 -0.1719174mean(c(1, 7, 13, NA), na.rm = TRUE)## [1] 7
如果你不知道某个函数的参数,你可以随时用?function_nam(函数名字)或help(function_name)(函数名字)来检查文档,例如:
?rnorm()## or:help(rnorm)
5. 错误的、不适当的或不一致的数据类型
在R中,有几种数据类型,主要的有
数值型、字符型、因子、逻辑的
你知道有些操作和分析是可能的,而且只适合于某些特定类型的数据。
例如,计算一个因子或字符变量的平均值是不合适的:
gender <- factor(c("female", "female", "male", "female", "male"))mean(gender)## Warning in mean.default(gender): argument is not numeric or logical: returning## NA## [1] NA
同样,尽管在技术上是可行的,但对定量连续变量画条形图是没有意义的,因为在大多数情况下,每个值的频率都是1:
(顺便说一下,如果你的数据还没有以表格的形式显示,不要忘记在barplot()函数中添加table()。
解决方案
请确保根据所关注的变量使用适当的操作和分析类型。
例如:
对于因子变量,计算频率和/或相对频率,并绘制柱状图是比较合适的。
对于定量连续变量,更适合计算平均值、中位数等,并绘制直方图、柱状图等。
对于逻辑变量,适合使用平均值、频率表和柱状图
对于字符变量,字云是最合适的(除非该变量可以被视为因子变量,因为没有太多的不同层次)。
我们现在用R来说明这些例子:
## factor:table(gender)## gender## female male ## 3 2prop.table(table(gender))## gender## female male ## 0.6 0.4barplot(table(gender))
## quantitative continuous:x <- rnorm(100)summary(x)## Min. 1st Qu. Median Mean 3rd Qu. Max. ## -2.99309 -0.74143 0.01809 -0.08570 0.58937 2.70189par(mfrow = c(1, 2)) ## combine two plotshist(x)boxplot(x)
## logical:x <- c(TRUE, FALSE, FALSE, TRUE, TRUE)mean(x)## [1] 0.6table(x)## x## FALSE TRUE ## 2 3barplot(table(x))
对于感兴趣的读者来说,请看R中对不同类型的数据最常用的描述性统计。
注意,与描述性统计一样,统计检验的选择取决于变量的类型。请看这个流程图,帮助你根据变量的数量和类型选择最合适的统计检验。
与上面提到的错误有关的是数据类型不一致。通过下面的例子可以看到它的实际情况:
x <- c(2.4, 3.7, 5.1, 9.8)class(x)## [1] "numeric"y <- c(2.4, 3.7, 5.1, "9.8")class(y)## [1] "character"
正如你所看到的,向量x是数值的,而向量y是字符的形式。这是由于y的最后一个元素被引号包围(因此被视为字符串而不是数值),因此整个向量采用字符形式。
当您将数据集导入R,并且变量的一个或多个元素未正确编码时,可能会发生这种情况。这导致R将整个变量视为字符变量。
为了避免这种情况,最好在导入数据集后检查数据集的结构(使用str()),以确保所有变量都具有所需的格式。如果没有,您可以更正初始文件中的值,或者更改R中的格式(使用as.numberic())。
6.忘记了ggplot2中的+号
如果你刚刚学会了使用ggplot2软件包进行可视化(我强烈推荐它!),一个常见的错误是忘记了+号。
您知道,使用ggplot2制作的可视化是通过添加几个层来构建的:
## load package:library(ggplot2)## first layer, the dataset:ggplot(data = diamonds) + ## second layer, the aesthetics: aes(x = cut, y = price) + ## third layer, the type of plot: geom_boxplot() + ## add more layers: theme_minimal()
解决方案
对于使用ggplot2的所有图形,请不要忘记在除最后一层外的每一层后面添加一个+号。
7. =和==之间的误解
R中的赋值可以用三种方式进行,从最常见到最不常见:
1.<-
2.=
3.assign()
第二种方法,也就是=,不应该与==混淆。
事实上,赋值对象(用上述三种方法中的任何一种)是用来在R中保存一些东西的。例如,如果我们想保存向量(1,3,7)并重命名该向量x,我们可以写:
x <- c(1, 3, 7)## or:x = c(1, 3, 7)## or:assign("x", c(1, 3, 7))
当执行这段代码时,你会看到大小为3的向量x出现在 "环境 "标签中(如果你使用RStudio的默认视图,则为右上角面板)
从现在开始,我们可以通过调用它的名字来使用该向量:
x
[1] 1 3 7
但不意味着,你可以用== 来分配一个对象:
##如果我们想将c(1,3,7)分配给x,则不正确:
x==c(1,3,7)##Error: object 'x' not found
所以你在想,我们什么时候需要使用==?实际上,它是在你想使用等号的时候使用的。
我知道它可能很抽象,而且目前很混乱,所以让我们假设以下两种情况作为例子(这是我们使用==的两种最常见的情况):
我们想检查一个被分配的对象或变量是否符合某些条件,以及我们想根据一个或几个条件对一个数据帧进行子集。
对于这些例子,假设有一个5个孩子的样本:
## create dataframe:dat <- data.frame( Name = c("Mary", "Linda", "James", "John", "Patricia"), Age = c(7, 10, 3, 9, 7), Gender = c("Girl", "Girl", "Boy", "Boy", "Girl"))## print dataframe:dat## Name Age Gender## 1 Mary 7 Girl## 2 Linda 10 Girl## 3 James 3 Boy## 4 John 9 Boy## 5 Patricia 7 Girl
现在让我们为这两个场景编写不同的代码来说明它们:
假设我们想检查变量Age是否等于向量(1,2,3,4,5):
dat$Age == 1:5## [1] FALSE FALSE TRUE FALSE FALSE
通过这段代码,我们问变量Age的第一个元素是否等于1,变量Age的第二个元素是否等于2,以此类推。答案当然是FALSE、FALSE、TRUE、FALSE和FALSE,因为只有第三个孩子的年龄等于3岁。
假设我们想知道5个抽样的孩子中哪些是女孩:
dat$Gender == "Girl"## [1] TRUE TRUE FALSE FALSE TRUE
结果显示,第一、第二和第五个孩子是女孩,而第三和第四个孩子不是女孩。
如果你写这两行中的任何一行:
## this overwrites Age and Gender:dat$Age = 1:5dat$Gender = "Girl"
你实际上覆盖了年龄和性别变量,这样我们的5个孩子的年龄将从1到5(第一个孩子是1岁,第五个孩子是5岁),所有的孩子都是女孩。(公众号@天桥下的的卖艺者:等于对年龄进行了重新编码)
现在假设我们想根据一个条件对我们的数据框架进行子集,即我们想只提取7岁的孩子:
subset(dat, Age == 7)## Name Age Gender## 1 Mary 7 Girl## 5 Patricia 7 Girl
如果你不想使用子集功能,你也可以使用方括号:
dat[dat$Age == 7, ]## Name Age Gender## 1 Mary 7 Girl## 5 Patricia 7 Girl
正如你在前面的例子中所看到的,我们并不想分配什么。相反,我们要问的是 “这个变量或向量是否等于其他东西?”。为了这个特定的需要,我们使用==。
因此,总结一下,由于技术原因和为了区分这两个概念,R使用=来表示赋值,而==表示平等符号。请确保理解这两者之间的区别,以避免任何错误。(公众号@天桥下的的卖艺者:=是给数据赋值,==是对两个值或向量进行判断是否相等)
8. 选择了未定义的列
如果你习惯于用方括号[],而不是subset()或filter()函数对数据集进行子集,你可能会遇到这样的错误
“Error in [.data.frame(…) : undefined columns selected” 。
这发生在R不理解你在对数据集进行子集时想要使用的列。
考虑到前面介绍的同一个5个孩子的样本,下面的代码将抛出一个错误:
dat[dat$Age == 7]
Error in [.data.frame
(dat, dat$Age == 7) : undefined columns selected
因为它没有指定列的维度。(公众号@天桥下的卖艺者:少了一个逗号,不知道是行还是列,所以说没有定义)
解决方案
请记住,R的数据框架有两个维度:
行(每个实验单元一个),和列(每个变量都有一个)。
而且是按照特定的顺序(所以先是行,后是列)!
因为数据框架有两个维度,所以当你调用dat[]时,R期望有两个维度。
特别是,它期望第一个维度,然后是第二个维度,用逗号分开:
dat[dat$Age == 7, ]## Name Age Gender## 1 Mary 7 Girl## 5 Patricia 7 Girl
这段代码意味着我们正在提取Age等于7的所有行(第一维,即逗号之前),用于数据集的所有变量(因为我们没有指定逗号之后的任何列)。
对于感兴趣的读者,请看在R中对数据进行子集和操作的更多方法。
9. 导入或使用错误数据文件时的问题
在R中导入数据集对初学者来说是相当有挑战性的,主要是由于对工作目录的误解。
当导入一个文件时,R不会在你的计算机的所有文件夹中搜索该文件。相反,它将只在一个特定的文件夹中寻找。如果你的数据集不在那个文件夹里,它将导致一个错误,“cannot open file ‘…’: No such file or directory”:
为了解决这个问题,你必须指定你的数据集所在的文件夹的路径。换句话说,你需要告诉R,你希望它在哪个文件夹中工作,因此被称为工作目录。
设置工作目录可以通过setwd()函数或通过RStudio右下角的 "文件 "标签来完成:
或者,你可以将数据集移到R当前工作的文件夹中(这可以用setwd()找到)。请看更多关于将文件导入R的细节和关于工作目录的细节。
另一个相关的问题是使用了错误的文件。这个错误与之前的错误不同,因为你不会遇到错误,但你的分析仍然是错误的。
这听起来很微不足道,但要确保导入和使用正确的数据文件!这一点在你的工作中尤为重要!如果你有不同时间点的文件,而且这些文件有共同的结构(例如,有完全相同的变量的每周或每月的数据文件),情况就尤其如此。我就遇到过这样的情况,我报告了错误的一周的结果(幸运的是,没有造成什么后果)。
另外,请确保你确实使用了你想包括在你的分析中的所有行。我曾遇到过这样的情况:为了测试一个模型(并避免长时间的计算),我从原始数据集中提取了一个随机样本,而在运行我的最终分析时几乎忘记了这个样本。
因此,提醒你在测试完你的代码后(在解释最终结果前)删除抽样和过滤器是一个好的做法。(公众号@天桥下的的卖艺者:注意你模型选取的数据是否正确,是原始数据还是整理后的数据或者是抽样数据)
10. 使用$
运算符时的问题
对于这个前10名中的最后一个错误,我想着重讨论两个相关的错误:
“$ operator is invalid for atomic vectors”, and
“object of type ‘closure’ is not subsettable”.
我把它们集中在一个章节中,因为它们是相互联系的,因为它们都涉及$运算符。
运算符对于原子向量是无效的,为了理解这个错误,我们首先要记住,原子向量是一个一维的对象(通常用 c ( ) 创建)。这与数据框架或矩阵不同,后者是二维的(即,行构成第一维,列对应第二维)。当我们试图使用美元运算符( ‘ 运算符对于原子向量是无效的,为了理解这个错误,我们首先要记住,原子向量是一个一维的对象(通常用c()创建)。这与数据框架或矩阵不同,后者是二维的(即,行构成第一维,列对应第二维)。 当我们试图使用美元运算符(` 运算符对于原子向量是无效的,为了理解这个错误,我们首先要记住,原子向量是一个一维的对象(通常用c()创建)。这与数据框架或矩阵不同,后者是二维的(即,行构成第一维,列对应第二维)。当我们试图使用美元运算符(‘`)访问原子向量的一个元素时,会出现错误"$运算符对原子向量无效":
## define atomic vector:x <- c(1, 3, 7)## set names:names(x) <- LETTERS[1:3]## print vector:x## A B C ## 1 3 7## access value of element C:x$C
Error in x$C : $ operator is invalid for atomic vectors
解决方案
$运算符不能用于提取原子向量中的元素。相反,我们必须使用双括号[[]]的符号:
x[["C"]]## [1] 7
请记住, 运算符可以用于数据框架,所以我们也可以通过首先将原子向量转换为数据框架来解决这个错误,然后用 运算符可以用于数据框架,所以我们也可以通过首先将原子向量转换为数据框架来解决这个错误,然后用 运算符可以用于数据框架,所以我们也可以通过首先将原子向量转换为数据框架来解决这个错误,然后用运算符通过其名称访问一个元素:
convert atomic vector to dataframe:
x <- as.data.frame(t(x))## print x:x## A B C## 1 1 3 7## access value of element C:x$C## [1] 7
object of type ‘closure’ is not subsettable,'closure’类型的对象不是子集表
另一个错误(我必须承认,在学习R的过程中,这个错误相当晦涩难懂,令人困惑)是以下内容: “Object of type ‘closure’ is not subsettable”。
这个错误发生在我们试图对一个函数的某些元素进行子集或访问时。以著名的mean()函数为例:
mean[1:3]
Error in mean[1:3] : object of type ‘closure’ is not subsettable
在R中,我们可以对列表、向量、矩阵、数据帧进行子集,但不能对函数进行子集。所以它抛出了一个错误,因为不可能对 "closure "类型的对象进行子集,而函数是这种类型的:
typeof(mean)## [1] "closure"
大多数情况下,在使用诸如mean()函数这样的基本函数时,你不会遇到这个错误(因为你的目标不太可能真的是对一个函数进行子集…)。
事实上,当你试图对一个名为data的数据集进行子集时,你很可能会遇到这个错误,但这个数据集并没有在环境中定义(因为它没有被正确导入或创建,例如)。
为了理解这个概念,请看下面的例子:
创建一个数据
data <- data.frame( x = rnorm(10), y = rnorm(10))## print variable x:data$x## [1] 1.12288964 1.43985574 -1.09711377 -0.11731956 1.20149840 -0.46972958## [7] -0.05246948 -0.08610730 -0.88767902 -0.44468400到目前为止还不错。现在假设我们在创建数据集时犯了一个错误:## create dataset (with mistake):data <- data.frame(x = rnorm(10) y = rnorm(10))
你会注意到,在变量x和y之间缺少一个逗号。因此,名为data的数据集没有被创建,因此没有被定义。
因此,如果我们现在试图从该数据集data中访问变量x,R实际上会试图对名为data的函数而不是名为data的数据集进行子集!(公众号@天桥下的的卖艺者:当R做不到你定义的数据,会从库中选一个名字相同的函数来定义,因此会出现此类错误)
data$x
Error in data$x : object of type ‘closure’ is not subsettable
这是因为,我重复一遍,数据集data并不存在,所以R寻找一个名为data的对象,并找到一个有这个名字的函数:
class(data)## [1] "function"
警告
警告与错误不同,它们提醒你一些事情,但它并不妨碍你运行代码。阅读这些警告是一个很好的做法,因为它们可能给你提供有价值的信息。
警告太多,无法一一列举,但我想重点介绍两个常见的警告:
“NAs introduced by coercion”, and
“Removed … rows containing non-finite values (stat_bin())”.
强制引入的NA值
当你试图将一个至少包括一个非数字值的向量转换为一个数字向量时,会出现这个警告:
x <- c(1, 3, 7, "Emma")as.numeric(x)## Warning: NAs introduced by coercion## [1] 1 3 7 NA
你不需要修复它,因为它只是一个警告而不是一个错误。R只是通知你,初始向量中至少有一个元素被转换为NA,因为它不能被转换为数值。
Removed … rows containing non-finite values (stat_bin())
这个警告发生在你使用ggplot2绘制图表的时候。比如说
ggplot(airquality) + aes(x = Ozone) + geom_histogram()
stat_bin()
using bins = 30
. Pick better value with binwidth
.
Warning: Removed 37 rows containing non-finite values (stat_bin()
).
同样,由于它是一个警告,你不需要修复它。它只是通知你,在感兴趣的变量中存在一些缺失值(NA),这些缺失值将被移除以构建图表。
谢谢你的阅读。我希望这个错误集合能够防止你犯一些编码错误,或者帮助你调试你的代码。
如果你仍然无法解决你的错误,我建议你阅读函数的文档(如果你对某个函数特别纠结的话),或者在网上寻找解决方案。请记住,如果你遇到了错误,很可能是别人在网上发布了答案(Stack Overflow通常是一个很好的资源)。
R有一个陡峭的学习曲线,特别是如果你不熟悉其他编程语言。尽管如此,随着练习和时间的推移,你的编码错误会越来越少,但更重要的是,你会越来越熟练地在搜索引擎中输入正确的关键词,从而减少寻找解决方案的时间。
像往常一样,如果你有与本文涉及的主题相关的问题或建议,请以评论的形式添加,以便其他读者能从讨论中受益。
后话,文章来源于https://statsandr.com/blog/top-10-errors-in-r/,我本人进行了翻译和一点点修编。
公众号@天桥下的的卖艺者:我早就想写一篇类似这样的文章,看到老外这篇文章写得很好,就搬过来了,自己修改和增加了一点东西,我们国人和老外输入法不同,还要注意一下不同输入法引起的括号、引号、冒号等符号不同出现的错误,开始敲代码的时候就先把它切换到英文状态是个良好的做法,希望对大家有帮助。
来源地址:https://blog.csdn.net/dege857/article/details/129744094