在2个函数中使用dataframe attr

时间:2019-11-21 17:22:01

标签: r lapply

我写了一个函数,使用数据框中每列的名称创建一个div。 我希望div的文本成为数据框的"labels" attr

library(shiny)

df <- data.frame(x = c(1, 2, 3), y = c(4, 5, 6), z = c(7, 8, 9))
attr(df$x, "labels") <- "a"
attr(df$y, "labels") <- "b"
attr(df$z, "labels") <- "c"

rowBlocks <- function(data, name, label)
{
  div(
    drag = name,
    div(class = "active-title", id = name, label))
}

lapply(sort(colnames(df[,1:3])), rowBlocks, 
       #Rather than have "Text below, 
       # How do I get the df attr "label" on hover?
                 data = df, label = "Text")

我不确定如何表达这个问题,但是我认为我需要使用一个带有两个函数的lapply,而且我也在努力访问lapply中的attr。

所需的输出

[[1]]
<div drag="x">
  <div class="active-title" id="x">a</div>
</div>

[[2]]
<div drag="y">
  <div class="active-title" id="y">b</div>
</div>

[[3]]
<div drag="z">
  <div class="active-title" id="z">c</div>
</div>

我尝试使用label = attr(df$name, "label"),但它按字面意义解释名称,而不使用实际的name变量...感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您可以更改rowBlocks函数以从数据中查找标签

rowBlocks <- function(data, name){
  div(
    drag = name,
    div(class = "active-title", id = name, attr(data[[name]],"labels")))
}

lapply(sort(colnames(df[,1:3])), rowBlocks, 
       data = df)

或者您可以更改调用方式以迭代名称和标签

rowBlocks <- function(name, label){
  div(
    drag = name,
    div(class = "active-title", id = name, label))
}
cols <- sort(colnames(df[,1:3]))
Map(rowBlocks, cols, sapply(cols, function(x) attr(df[[x]], "labels")))

在这里,我们使用Map而不是lapply,因为我们需要遍历多个输入。