理解和重建数据帧到 d3 格式的过载

Understanding and rebuilding overload of a dataframe to d3 format

从 R 到 nvd3 折线图,我真的对数据帧过载的函数感到绝望。我的意图是使用 nvd3 折线图在 R Shiny 应用程序中显示数据框,如下所示:

https://shiny.rstudio.com/gallery/nvd3-line-chart-output.html

主要问题是,X 轴只是一个递增的数字,由重载数据帧的行数给出(如上例所示)。我需要将数据框的第一列作为我的 x 轴。因此我想更改代码,实际目标是用 R 中可用的 r2d3 函数替换它。

在这个例子中我不明白以下事情: 数据帧如何重载到 mentoined 函数然后重载到图表? 谁能告诉我一种查看转换函数输出的方法,并将其替换为手动创建的 d3 字符串以进行测试?

函数的调用:

output$mychart <- renderLineChart({
  df_stocking_catches
})

功能没看懂

# To be called from server.R
renderLineChart <- function(expr, env=parent.frame(), quoted=FALSE) {
  # This piece of boilerplate converts the expression `expr` into a
  # function called `func`. It's needed for the RStudio IDE's built-in
  # debugger to work properly on the expression.
  installExprFunction(expr, "func", env, quoted)

  function() {
    dataframe <- func()

    mapply(function(col, name) {

      values <- mapply(function(val, i) {
        list(x = i, y = val)
      }, col, 1:nrow(dataframe), SIMPLIFY=FALSE, USE.NAMES=FALSE)

      list(key = name, values = values)

    }, dataframe, names(dataframe), SIMPLIFY=FALSE, USE.NAMES=FALSE)
  }
}

感谢您提出任何建议。 山姆

我通过将索引 x = i 更改为找到解决方案的第一步 x = dataframe[i,1] 此更改将第一列作为图表的 x 值

但是,第一列仍然显示为线图中的一条线,这没有意义......也许任何人都知道如何更改代码以跳过第一列作为线值。

有什么想法吗?

renderLineChart <- function(expr, env=parent.frame(), quoted=FALSE) {
  # ...
  installExprFunction(expr, "func", env, quoted)

  function() {
    dataframe <- func()

    mapply(function(col, name) {
      print(name)
      values <- mapply(function(val, i) {
        list(x = dataframe[i,1], y = val)
      }, col, 1:nrow(dataframe), SIMPLIFY=FALSE, USE.NAMES=FALSE)
...

欢呼,明白了! 它不是很漂亮,但它完全符合我的要求。使用调试函数browser()和print()命令一步步分析函数。自己解决了感觉自己是个天才,但是还是没看懂这段烂代码

renderLineChart <- function(expr, env=parent.frame(), quoted=FALSE) {
  installExprFunction(expr, "func", env, quoted)

  function() {
    dataframe <- func()

    mapply(function(col, name) {
      if(name!="Year"){
        values <- mapply(function(val, i) {
          list(x = dataframe[i,1], y = val)
          #browser()
          #print(dataframe[i,1])
        }, col, 1:nrow(dataframe), SIMPLIFY=FALSE, USE.NAMES=FALSE)
        list(key = name, values = values)

      }
    }, dataframe[,-1], names(dataframe[,-1]), SIMPLIFY=FALSE, USE.NAMES=FALSE)
  }
}

希望任何人都能从中得到启发post。 再见