在像data.frame这样的列赋值中循环时,如何使R data.table抛出错误?

在像data.frame这样的列赋值中循环时,如何使R data.table抛出错误?,r,data.table,R,Data.table,有没有办法使data.table遵循与data.frame相同的规则进行回收 我不想回收,因为大多数时候它是代码中的一个bug。 data.table中是否有实现此目的的选项 (将警告设置为错误不是选项…) >df$b df$b亨里克的评论让人觉得你做不到。但是没有什么能阻止你在代码中添加测试,让你安心 mySet <- function(df, j, value){ testthat::expect_true(nrow(df) == length(value), "Number of

有没有办法使data.table遵循与data.frame相同的规则进行回收

我不想回收,因为大多数时候它是代码中的一个bug。 data.table中是否有实现此目的的选项 (将警告设置为错误不是选项…)


>df$b df$b亨里克的评论让人觉得你做不到。但是没有什么能阻止你在代码中添加测试,让你安心

mySet <- function(df, j, value){
  testthat::expect_true(nrow(df) == length(value), "Number of rows are not equal")
  set(df, j=j, value=value)
  return(df)
} 

# original warning
df$b <- 1:9
# errors
mySet(df, "c", 1:9)
# passes
mySet(df, "d", 1:10)[]

mySet我怀疑你的欲望没有得到很好的激发,但是你可以用这样的东西来包装你所有的代码:

withCallingHandlers({
                      warning("some other warning")
                      print("some code we get to")
                      df[, b := 1:7]
                      print("the rest of your code we don't get to")
                    },
                    warning = function(w) {
                      if(grepl("data.table", w$call[[1]])) stop(w$message)
                    })
#[1] "some code we get to"
#Error in (function (w)  : 
#  Supplied 7 items to be assigned to 10 items of column 'b' (recycled leaving #remainder of 3 items).
#In addition: Warning message:
#In withCallingHandlers({ : some other warning
按照同样的思路,您还可以尝试以下方法:

options( warning.expression = {substitute({
           tr = traceback(5)
           if (grepl("data.table", tr[[1]]))
             stop("data.table warning converted to error")
         })})
{warning('test'); print('get here'); df[, b := 1:7]; print('but not here')}
#1: warning("test") at #1
#[1] "get here"
#2: `[.data.table`(df, , `:=`(b, 1:7)) at #1
#1: df[, `:=`(b, 1:7)] at #1
#Error in doWithOneRestart(return(expr), restart) : 
#  data.table warning converted to error

和往常一样,在处理这种低层次的表达式分析时——请注意,可能会有龙。

如果存在这样的选项,我怀疑这里会提到它:,或者在其中找到它。(也许你需要修改一下代码?)谢谢你一直在寻找一些相关的问题。好吧,我想我需要避免这种构造:)
options( warning.expression = {substitute({
           tr = traceback(5)
           if (grepl("data.table", tr[[1]]))
             stop("data.table warning converted to error")
         })})
{warning('test'); print('get here'); df[, b := 1:7]; print('but not here')}
#1: warning("test") at #1
#[1] "get here"
#2: `[.data.table`(df, , `:=`(b, 1:7)) at #1
#1: df[, `:=`(b, 1:7)] at #1
#Error in doWithOneRestart(return(expr), restart) : 
#  data.table warning converted to error