如何将formattable格式应用于多个列?

如何将formattable格式应用于多个列?,r,formatting,r-markdown,R,Formatting,R Markdown,我有两个data.frames(每个最初都是一个较大的父三维数组的维度)。一个保存数值。另一个具有T/F值,指示第一个数组中每个值的置信区间是否与参考置信区间重叠。数组中每个值的置信区间都不同,因此在格式化表时,我不能引用常量,只能引用t/F值数组 我想显示第一个数组的表,每个单元格的背景色基于第二个数组。为了使formattable可以看到具有T/F值的列,我创建了一个数据框,用于绑定来自两个第三维度的列。在实际数据中,大约有20列数值。以下是一个简化的示例: orig.data <-

我有两个data.frames(每个最初都是一个较大的父三维数组的维度)。一个保存数值。另一个具有T/F值,指示第一个数组中每个值的置信区间是否与参考置信区间重叠。数组中每个值的置信区间都不同,因此在格式化表时,我不能引用常量,只能引用t/F值数组

我想显示第一个数组的表,每个单元格的背景色基于第二个数组。为了使formattable可以看到具有T/F值的列,我创建了一个数据框,用于绑定来自两个第三维度的列。在实际数据中,大约有20列数值。以下是一个简化的示例:

 orig.data <- array(dim = c(3, 4, 2))
 dimnames(orig.data) <- list (c("site1", "site2", "site3"), c("model1", "model2", "model3",
   "model4"), c("mean.val", "is.in.CI"))
 orig.data[,,1] <- round(runif(12, 2, 10), 2)
 orig.data[,,2] <- as.logical(round(runif(12, 0, 1)))
 ft.data <- data.frame(orig.data[,,2], stringsAsFactors = F)
 colnames(ft.data) <- paste0("match.", colnames(ft.data))
 ft.data <- cbind(data.frame(orig.data[,,1], stringsAsFactors = F), 
    ft.data)
如果省略带有T/F名称的列,格式化程序就不知道它们存在

  area(col = 5:8) = F)) # no effect
在formattable命令之外,创建一个字符串:

 formatter.string <- paste( unlist(paste0("match.", c(“model1”, “model2”, “model3”, “model4”), " = #F,\n\t")), collapse='')

这是我用一些
eval
/
parse
magic能想到的最好方法:

format <- sapply(names(ft.data)[1:4],function(x)
{
  eval( #evaluate the following expression
    parse(text=  #parse the following string to an expression
        sub("_SUB_", #find "_SUB_"
            paste0("`match.",x,"`"), #replace with name of column
            "formatter(\"span\", style = ~ style(display = \"block\", #in the string containing the formatter call
                                      \"border-radius\" = \"4px\", \"padding-right\" = \"4px\",
                                      \"background-color\" =  ifelse(_SUB_, yes.color, no.color)))")))
},simplify=F,USE.NAMES = T)

#hiding part. Same concept as above
hide <- sapply(names(ft.data[5:8]), function(x) eval(parse(text=sub("_SUB_",x,"_SUB_ = F"))),
               simplify=F,USE.NAMES=T)

formattable::formattable(ft.data,c(format,hide))


格式太干净了!
 formatter.string <- paste( unlist(paste0("match.", c(“model1”, “model2”, “model3”, “model4”), " = #F,\n\t")), collapse='')
  eval(parse(formatter.string)))) # no effect  OR
  lapply(5:8, function(m.col){m.col = F}) # also no effect
format <- sapply(names(ft.data)[1:4],function(x)
{
  eval( #evaluate the following expression
    parse(text=  #parse the following string to an expression
        sub("_SUB_", #find "_SUB_"
            paste0("`match.",x,"`"), #replace with name of column
            "formatter(\"span\", style = ~ style(display = \"block\", #in the string containing the formatter call
                                      \"border-radius\" = \"4px\", \"padding-right\" = \"4px\",
                                      \"background-color\" =  ifelse(_SUB_, yes.color, no.color)))")))
},simplify=F,USE.NAMES = T)

#hiding part. Same concept as above
hide <- sapply(names(ft.data[5:8]), function(x) eval(parse(text=sub("_SUB_",x,"_SUB_ = F"))),
               simplify=F,USE.NAMES=T)

formattable::formattable(ft.data,c(format,hide))