将 table 作为函数参数和值传递

passing a table as function parameters and values

假设我有以下函数,它有很多参数,但为了简单起见,我在这里只列出两个:

library(glue)
glue("{a} + {b} is equal to 3", a = 1, b = 2)

现在我有一个 data.table,其中包含我要传递给 glue 函数的所有 arguments/values: data.table:

library(data.table)
DT <- data.table(varnames = c("a", "b"), values = c(1, 2))

如何将 arguments/values 从我的 DT 直接传递到我的 glue 函数?

在这种情况下,如果您将 ab 作为单独的列,将会有所帮助。

library(data.table)
library(glue)

DT_Wide <- dcast(DT, rowid(varnames)~varnames, value.var = 'values')
DT_Wide

#   varnames a b
#1:        1 1 2

那你可以用glue_data-

glue_data(DT_Wide, "{a} + {b} is equal to 3")

#1 + 2 is equal to 3

您可以使用 setNames 并调用 glue_data:

glue_data(setNames(DT$values, DT$varnames), "{a} + {b} is equal to 3")
#1 + 2 is equal to 3

或者您使用 do.call:

do.call(glue, as.list(c("{a} + {b} is equal to 3",
    setNames(DT$values, DT$varnames))))
#1 + 2 is equal to 3

有点hackish,但完成了工作并概括为更大的data.frame:

DT <- data.table(varnames = c("a", "b", "c"), values = c(1, 2, 3))
DT[, glue_data(
       setNames(values, varnames),  
       glue_data(
         .SD,
         "{paste(sprintf('{%s}', varnames), collapse = ' + ')}", " is equal to {sum(values)}"
       )
     )]
# 1 + 2 + 3 is equal to 6

我会保持简单并使用基础 R 的 with,因为这是有用的好例子:

library(glue)
library(data.table)
DT = data.table(varnames = c("a", "b"), values = c(1, 2))
with(
  as.list(setNames(DT$values, DT$varnames)),
  glue("{a} + {b} is equal to 3")
)
#1 + 2 is equal to 3