【问题标题】:Use dataframe attr within 2 function lapply在 2 个函数 lapply 中使用数据帧 attr
【发布时间】:2019-11-21 17:22:01
【问题描述】:

我编写了一个函数来使用数据框中每一列的名称创建一个 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"),但它按字面意思解释名称,而不是使用实际的名称变量...感谢任何帮助!

【问题讨论】:

  • 你可以在函数rowBlocks中使用attr(data[,name], "labels")
  • div 函数不是 Base R。它是来自包还是您在某个地方定义的?请在您的问题中包含此信息以使其可重现。
  • 糟糕!谢谢你的收获 - 我正在尽可能多地剥离我的闪亮应用程序以使其成为一个重复!

标签: r lapply


【解决方案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,因为我们需要循环多个输入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-04
    • 2019-07-08
    • 2019-05-20
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 2020-09-11
    • 2018-06-08
    相关资源
    最近更新 更多