【问题标题】:R How to pass inputs to setorder in a functionR如何将输入传递给函数中的setorder
【发布时间】:2016-08-17 23:57:06
【问题描述】:

我想在函数中将输入传递给 setorder。理想情况下,我希望该函数在数据表中获取数据表名称和变量名称,根据变量重新排序表,然后做一些其他事情。

这是一个我想做但不起作用的例子。

dt <- data.table(replicate(10,sample(0:100,1000,rep=TRUE)))
sortFunction <- function(dt,var) {
     v2 <- deparse(substitute(var))
     data.table::setorder(dt,v2)
     return(dt)
}

sortFunction(dt, var = "V1")

理想情况下,我想让函数识别字符变量dt 是全局环境中的数据表;即 dtvar 都将作为字符变量传递,然后被识别为数据表和

【问题讨论】:

  • 还有setorderv所以你可以做setorderv(dt, "V2")并避免deparse(substitute(...
  • 这个建议解决了第一个问题。代码sortFunction &lt;- function(dt,var) { data.table::setorderv(dt,var) return(dt) } sortFunction(dt, var = "V2") 符合我的要求。将 dt 的名称而不是 dt 本身传递给函数怎么样?
  • 我真的不推荐它,但你可以做f &lt;- function(dt,var) {tmp &lt;- get(dt,envir=.GlobalEnv); setorderv(tmp,var); tmp}或类似的东西。
  • 对我的问题更好的解决方案是继续将dt传递给函数,并使用deparse(substitute(dt))获取数据表的名称。但是,很高兴有您提出的“获取”方法。
  • 如果您想按名称引用 data.table,我建议您将 data.tables(通常是任何其他数据类型)保留在新环境中,而不是 .GlobalEnv。此外,您可以自行回答问题或将其删除。

标签: r function data.table


【解决方案1】:

这就是我最终做的事情。

  • 继续传入数据表而不是尝试通过 get(dt,envir=.GlobalEnv.

  • 将 setorderv 与数据表和字符名称一起使用 列,因为 setorderv 想要一个列名/列名作为 字符变量。

  • 虽然这不是问题,但我试图做的是一些 函数内部的图形。我想出了如何在 j 字段中放置一系列图 数据表。

这是目前的完整功能。我在没有完整解释的情况下发布它,因为在发布此问题之前拥有此代码 sn-p 对我很有用。

deltaPlot <- function(dt, var, title, ylabel, regions) {
  if (missing(regions)) {regions <- 156}
  dt.temp <- data.table::copy(dt)
  data.table::setorderv(dt.temp, var)
  junk <- dt.temp[,{
    plot(x = get(var), type = "s", main = title,
                 ylab = ylabel,
                 xlab = "",
                 xaxt = "n",
                 cex.lab = 0.8, mgp = c(2.5, 1, 0),
                 yaxs = "r")
    abline(h = 0)
    axis(1, at = 1:regions, labels = region_code.IMPACT159, cex.axis = 0.5)}
    ]
}

var 和 region_code.IMPACT159 中包含的字符串都是 dt 中的列。 var 列是数字,region_code.IMPACT159 是字符。

deltaPlot(dt = dt.budgetShare.wide,
          var = "delta.SSP1", title = "Delta SSP1",
          ylabel = "Change in IMPACT commodity\nshare of per capita GDP (%)"
)

还有输出。

【讨论】:

    猜你喜欢
    • 2015-06-08
    • 2020-07-17
    • 2014-04-30
    • 2021-12-26
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    相关资源
    最近更新 更多