了解数据帧并将其重新构建为d3格式的重载

问题描述 投票:0回答:2

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

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

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

在此示例中,我不了解以下内容:数据框如何重载到预定功能,然后再重载到图表?谁能告诉我一种方法来查看转换函数的输出,并将其替换为手动创建的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)
  }
}

谢谢您的任何建议。山姆

r d3.js shiny nvd3.js
2个回答
0
投票

我找到了解决方案的第一步,方法是将索引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)
...

0
投票

欢呼,知道了!它不是很漂亮,但是完全可以按照我的要求工作。使用了调试功能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)
  }
}

希望任何人都会从这篇文章中得到启发。再见

© www.soinside.com 2019 - 2024. All rights reserved.