在group_by
中使用dplyr
时有一个超级随机错误,如下所示
dat %>% group_by(variable) %>% mutate(score = score[1])
其中dat
是带因子/字符列的data.frame
,variable
和score
是双列。我得到的错误是:
Value of SET_STRING_ELT() must be a 'CHARSXP' not a 'character'
不管计算的variable
.
score[1]
).
variable
或score
做各种计算。变量只有重复的条目"arima“和”预言家“,没有NA
s.
快把我逼疯了。
我在googled上搜索了错误,找不到好的帮助,除了缩小它,这就是我所做的,即一个简单的group_by
计算。此外,我重新启动了R会话,重新启动了计算机,更新了我的R版本和dplyr
包,该包现在在版本1.07上。我在Ubuntu20.04.3LTS上使用RVersion4.1.1。
对什么可能会产生这个错误有任何想法吗?
编辑I不能提供一个可复制的模拟数据样本,因为它只发生在特定数据上。在这里,我上传了导致错误https://filebin.net/9pywc544hsmgm2p3的数据
然后运行以下代码
A <- readRDS("dat.rds") %>%
group_by(variable) %>%
mutate(score = score[1])
有趣的是,如果您按照A[1:nrow(A), ]
而不是A
进行分组,那么它可以工作,尽管它是相同的数据。
编辑2: --我现在可以运行几次计算了,但是在某些时候,对于相同的计算,我总是会得到一个致命的错误。我觉得这似乎是我的系统特有的。所以我可能要重新安装所有的东西。
编辑3: the as.numeric(score)
解决了这个问题。所以看来分数的名字属性有问题了。然而,他们看起来并不可疑,而且都有相同的名字,即"new_confirmed10“。
发布于 2021-10-29 10:28:09
这是实现R函数的C代码中的内部错误。它不应该发生在用户代码中。这肯定是个窃听器。您可以在看到traceback()
后立即运行它,从而稍微缩小位置。这将列出在错误发生时活动的所有R函数,并可能给出调用buggy代码的R函数的位置。
请结合一个可重复的例子(即,给我们一种构造dat
的方法,以便我们可以在我们的系统上再现它)。因此,这里的人将能够找到错误的原因,也许能够告诉您一个解决办法,或者告诉代码的作者如何修复它。
如果你不能这样做,不太可能有人能帮助你,但以下是一些一般性的建议:
gdb
或lldb
进行C级调试。如果你以前没有使用过这些,那就不容易了。--编辑后添加:
在检查了dat.rds
文件的上传版本之后,我想我已经发现了问题的一部分。运行以下代码:
dat <- readRDS("dat.rds")
table(names(dat$score))
我看到dat$score
的名字是"new_confirmed10"
的744份。重复名字是不寻常的,但是是合法的。然而,dat$score
的长度是1488 (与dat
的行数相同),据我所知,拥有与对象长度不同的名称是合法的。(如果只为某些元素分配名称,则应该在其他元素上获得名称NA
。)
当您运行您的代码时,变异调用中的某些内容会崩溃,因为它假定对象格式良好,而不是。所以这不是dplyr
中的bug,但我认为它是在dat.rds
中创建对象的任何代码中的一个bug。您有关于它是如何创建的记录吗?
发布于 2021-10-29 19:50:06
我有点解决了。score
是Named num
。在做了as.numeric(score)
之后,它成功了。仍然不知道为什么名称属性会导致这个错误(它们看起来都很正常),但也是如此。当我将数据导出为.csv
和.rds
时,我就意识到了这一点,只有在重新加载.rds
数据时才会发生错误,因此我认为它必须与一些数据属性相关。
发布于 2021-11-01 11:17:21
谢谢您的重新上传;我可以很好地阅读d <- readRDS(".../dat.rds")
,然后很容易地看到@ then 2554330上面写的内容:
> d <- readRDS("<....>/dat.rds")
> str(d)
'data.frame': 1488 obs. of 4 variables:
$ facet_var: chr "AUT" "AUT" "AUT" "AUT" ...
$ date : Date, format: "2020-04-26" "2020-04-27" ...
$ variable : Factor w/ 2 levels "arima","prophet": 1 1 1 1 1 1 1 1 1 1 ...
$ score : Named num 2.74e-06 2.41e-06 2.48e-06 2.39e-06 2.79e-06 ...
..- attr(*, "names")= chr [1:744] "new_confirmed10" "new_confirmed10" "new_confirmed10" "new_confirmed10" ...
>
因此,问题仍然存在:无效的score
列是如何创建的?我假设是一些C代码无效地工作,因为我不认为您可以使用简单的R代码来创建它。
这是一个无效对象的“证据”,可以重复使用
> ds <- d$score
> dput(ds)
*** caught segfault ***
address (nil), cause 'memory not mapped'
Traceback:
1: dput(ds)
Possible actions:
1: abort (with core dump, if enabled)
2: normal R exit
3: exit R without saving workspace
4: exit R saving workspace
Selection:
https://stackoverflow.com/questions/69767054
复制相似问题