R:值未用函数替换为for循环 更新:总体比例

我正在尝试创建一个列表,然后将其放入函数中。

我的问题是“ col”从未被增量变量(j)取代。它仍然是“ j”。因此,在我的for循环结束时,当j为11时,如果将其应用于函数,列表中所有元素的所有col也是j,所以11也是如此。

library(formattable)

x <- data.frame("value" = rep(1:5,2),"cats" = c(10,20,30,40,NA),"dogs" = c(15,25,35,36,48),"fish" = c(20,14,89,"chicken"=c(14,23,12,9,3),"test"=c(TRUE,TRUE,FALSE,FALSE))

l=list()
for (j in 1:ncol(x)) {
  if (is.na(x[nrow(x),j])) {
    l[[j]]=area(row=1:(nrow(x)-1),col=j) ~ color_bar(color = "#E0E0E0",na.rm = TRUE)
  } 
  else {
    l[[j]]=area(row=1:(nrow(x)-1),col=j) ~ color_bar(color = "#99CCFF",na.rm = TRUE)
  }
}
l
formattable(x,l)

可能是什么问题?

iCMS 回答:R:值未用函数替换为for循环 更新:总体比例

发生这种情况是因为

该函数创建一个Area对象来存储行和列选择器表达式的表示形式。调用该函数时,将捕获format表格的行和列的表达式和环境,以供format_table在输入数据的上下文中求值。即,在上下文中将行名和列名定义为行和列的索引,分别。因此,当对row和col求值时,行名和列名可用符号

(强调从help("area")开始)。

因此,它正在访问绑定到符号 j的值。

您要做的是将公式传递给j的正确 value

l=list()
for (j in 1:ncol(x)) {
    if (is.na(x[nrow(x),j])) {
        print("yes")
        l[[j]] <- as.formula(
            paste("area(row=1:(nrow(x)-1),col=",j,") ~ color_bar(","color = \"#E0E0E0\",na.rm = TRUE)")
        )
    } 
    else {
        print("no")
        l[[j]] <- as.formula(
            paste("area(row=1:(nrow(x)-1),"color = \"#99CCFF\",na.rm = TRUE)")
        )
    }
}
l
formattable(x,l)

enter image description here

更新:总体比例

默认情况下,采用这种方法,条的大小将为列内比例。如果需要总体比例,可以像这样将自定义fun参数传递给color_bar()

l=list()
for (j in 1:ncol(x)) {
    if (is.na(x[nrow(x),","fun = function(y) y / max(x,na.rm = TRUE))")
        )
    } 
    else {
        print("no")
        l[[j]] <- as.formula(
            paste("area(row=1:(nrow(x)-1),na.rm = TRUE))")
        )
    }
}
l
formattable(x,l)

enter image description here

本文链接:https://www.f2er.com/2163507.html

大家都在问