在R中如何将参数作为字符串传递给诸如plotXtabs2之类的函数?

时间:2020-05-08 19:52:58

标签: r function eval

PlotXTabs2是用于在至少需要3个最小参数的类别变量之间绘制交叉表比例的功能

PlotXTabs2( 数据, X, y)

数据作为该数据帧的数据帧,x和y列名。

我想在一个循环中调用它,其中列名x,y将是来自dataframe colnames()的字符串,类似于....

varscat = colnames(df)

for(i in 1:(length(varscat)-1)) 
{
  for(j in (i+1):length(varscat))
  {
     tmp <- df[,c(myvars[varscat[i]], myvars[varscat[j]])]

     # ...

     PlotXTabs2( df, x=myvars[varscat[i]], y=myvars[varscat[j]] ) 
 }
}

我一直在尝试使用eval,do.call进行示例,但均未成功,其中大多数与预期用途是编写函数以接受参数作为字符串的情况有关。

如何获得此结果?

2 个答案:

答案 0 :(得分:4)

您可以使用!!中的rlang

library(CGPfunctions)
#> Registered S3 methods overwritten by 'lme4':
#>   method                          from
#>   cooks.distance.influence.merMod car 
#>   influence.merMod                car 
#>   dfbeta.influence.merMod         car 
#>   dfbetas.influence.merMod        car
library(ggplot2)
out <- lapply(combn(colnames(mpg), 2, simplify = FALSE), 
       function(z) PlotXTabs2( mpg, !!z[1], !!z[2]) )
out[[3]] ## example plot from the list

reprex package(v0.3.0)于2020-05-08创建

编辑:

变量对的顺序会影响图形的生成方式。我们可以使用如下函数专门选择对中的第一个和第二个元素:

plotPairs <- function(xvals, yvals, data, ...){
    pairs <- as.list(data.frame(t(expand.grid(xvals, yvals))))
    lapply(pairs, function(z) PlotXTabs2( data, !!z[1], !!z[2], ...))
}

out <- plotPairs(
    xvals = c("vs", "cyl", "gear"),
    yvals = c("am", "carb"),
    data = mtcars, 
    ylab = NULL,
    perc.k = 1,
    palette = "Set2")

答案 1 :(得分:2)

感觉必须作为函数作者来展示我通常如何使用它,并避免引用的麻烦。插图和帮助文件显示了更复杂的示例,您可以在其中使用pmap来构建标题等,等等。

library(CGPfunctions)

# you can build by column number
# cross2_var_vectors(mtcars, 9, c(2, 10:11))
# or column name
# cross2_var_vectors(mtcars, "am", c("cyl", "gear", "carb"))
# build the vectors by hand
x2 <- c("am", "carb")
y2 <- c("vs", "cyl", "gear")
# cross2_var_vectors(mtcars, x2, y2, verbose = TRUE)

variables_list <- cross2_var_vectors(mtcars, x2, y2)

plotlist <- purrr::map2(
  .x = variables_list$lista
  .y = variables_list$listb,
  .f = CGPfunctions::PlotXTabs2,
  data = mtcars,
  ylab = NULL,
  perc.k = 1,
  palette = "Set2"
)

plotlist[[2]]

reprex package(v0.3.0)于2020-05-11创建