Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何在datatable';styleEqual()?_R_Datatable_Na_Dt - Fatal编程技术网

R 如何在datatable';styleEqual()?

R 如何在datatable';styleEqual()?,r,datatable,na,dt,R,Datatable,Na,Dt,我有一个R datatable对象,其中的空/空单元格对应于数据帧(相关矩阵)中的NA。如果单元格包含1、-1或为空,我想更改单元格的背景色 这段代码创建了一个表,并使用styleEqual()将单元格标记为1或-1,但我找不到缺少/blank/NA的合适规范。如何在styleEqual()中标识空白单元格 df您可以在styleEqual上更接近地找到答案。它从JS函数中输出一个字符串,该函数具有类“JS_EVAL”,您可以通过直接调用styleEqual查看该类 styleEqual(c(-

我有一个R datatable对象,其中的空/空单元格对应于数据帧(相关矩阵)中的NA。如果单元格包含1、-1或为空,我想更改单元格的背景色

这段代码创建了一个表,并使用styleEqual()将单元格标记为1或-1,但我找不到缺少/blank/NA的合适规范。如何在styleEqual()中标识空白单元格


df您可以在
styleEqual
上更接近地找到答案。它从JS函数中输出一个字符串,该函数具有类“JS_EVAL”,您可以通过直接调用styleEqual查看该类

styleEqual(c(-1, 1, NA), c('gray', 'green', 'red'))

# [1] "value == -1 ? \"gray\" : value == 1 ? \"green\" : value == \"NA\" ? \"red\" : value"
# attr(,"class")
# [1] "JS_EVAL"
从这里开始,您只需要知道javascript如何处理NA值(NaN),您可以创建自己的颜色方案,然后您可以通过修改值来创建自己的字符串

myJScolor = "value == -1 ? \"gray\" : value == 1 ? \"green\" : isNaN(parseFloat(value)) ? \"red\" : value"
class(myJScolor) = "JS_EVAL"
myJScolor
dt2 <- DT::formatStyle(dt, c(1:ncol(df)), backgroundColor = myJScolor )
dt2
myJScolor=“value==-1?\“gray\”:value==1?\“green\”:isNaN(parseFloat(value))?\“red\”:value
类别(myJScolor)=“JS_EVAL”
myJScolor

dt2非常棒。问题是空白单元格的实际值是多少。显然,它不是NaN或“”。我试图通过除以值使其变为NaN:isNaN(parseFloat(1/value)),但这也不起作用。JS和R都将其视为“非数字”,因此使用“==”根本不起作用-如果您比较R中
1==1
NA==NA的结果,就会看到这一点。您必须使用
is.NA(NA)
在R中获取一个非缺失逻辑值,用于测试缺失值的存在。如果需要以编程方式执行此操作,而不仅仅是针对一次性表,则可以在R中创建一个版本的“styleEqual”函数,该函数可以更好地处理缺少的值(使用
is.na
,而不是
=
)?这是行不通的:myJScolor请参见编辑我的帖子,它更改了styleEqual的源代码,使之成为一个新函数,以更通用的方式处理NAs。我感谢您的努力,并理解您的建议,但问题非常具体。代码myJScolor
myJScolor = "value == -1 ? \"gray\" : value == 1 ? \"green\" : isNaN(parseFloat(value)) ? \"red\" : value"
class(myJScolor) = "JS_EVAL"
myJScolor
dt2 <- DT::formatStyle(dt, c(1:ncol(df)), backgroundColor = myJScolor )
dt2
 df <- data.frame(x = c(1, .3, NA),
                  y = c(.3, 1, -1),
                  z = c(NA, -1, 1))

 newstyleEqual <- function (levels, values, default = NULL) 
 {
   n = length(levels)
   if (n != length(values)) 
     stop("length(levels) must be equal to length(values)")
   if (!is.null(default) && (!is.character(default) || length(default) != 
                             1)) 
     stop("default must be null or a string")
   if (n == 0) 
     return("''")
   levels = DT:::jsValues(levels)
   values = DT:::jsValues(values)
   js = ""
   for (i in seq_len(n)) {
     if(levels[i]=="\"NA\""){ # needed because jsValues converts NA to a string
       js = paste0(js, sprintf("isNaN(parseFloat(value)) ? %s : ",
                               values[i]))

     }else{
       js = paste0(js, sprintf("value == %s ? %s : ", levels[i], 
                                   values[i]))
       }

   }
   default = if (is.null(default)) 
     "value"
   else jsValues(default)
   DT::JS(paste0(js, default))
 }

 dt <- DT::datatable(df)

 dt <- DT::formatStyle(dt, c(1:ncol(df)), backgroundColor = newstyleEqual(c(-1, 1, NA), c('gray', 'green', 'red')))
 dt