R 在用户定义函数中调用列名

R 在用户定义函数中调用列名,r,function,ggplot2,data.table,R,Function,Ggplot2,Data.table,我想创建一个用户定义的函数来消除代码冗余/重复 我想为multiplecol2(有几个级别)和GROUP byGROUP列绘制这样的多个绘图 所需绘图的示例图像: fn.colplot <- function(data, col2, GROUP) { dt_PCT <- data[, .N, by = .(col2, GROUP)] dt_PCT[, PCT := round(100*N/sum(N)), by = .(GROUP)] dt_plot <- ggplot(dt_

我想创建一个用户定义的函数来消除代码冗余/重复

我想为multiple
col2
(有几个级别)和GROUP by
GROUP
列绘制这样的多个绘图

所需绘图的示例图像:

fn.colplot <- function(data, col2, GROUP) {
dt_PCT <- data[, .N, by = .(col2, GROUP)]
dt_PCT[, PCT := round(100*N/sum(N)), by = .(GROUP)]
dt_plot <- ggplot(dt_PCT, aes(GROUP, PCT, fill = factor(col2))) +
geom_col(position = "fill") + 
geom_text(aes(label = paste0(PCT,"%")), position = position_fill(vjust = 0.5))
return(dt_plot)
}

我想问一下,在用户定义的函数中,如何在
by=
之后调用列名

如果我拿出脚本并插入列的真实名称,它会工作得很好


谢谢大家的建议,我已经通过调用带有如下特定参数的函数解决了这个问题:
fn.colplot(data=dt_-all,col2=“DISTRIBUTORS”,GROUP=“GROUP”)
。我可以顺利地运行函数并绘制很多图。谢谢@RonakShah

将列名作为字符串传递,并在函数中进行这些更改

library(data.table)
library(ggplot2)

fn.colplot <- function(data, col2, GROUP) {
  dt_PCT <- dt[, .N, c(col2, GROUP)]
  dt_PCT[, PCT := round(100*N/sum(N)), by = .(GROUP)]

  dt_plot <- ggplot(dt_PCT, aes(.data[[GROUP]], PCT, 
                   fill = factor(.data[[col2]]))) +
    geom_col(position = "fill") + 
    geom_text(aes(label = paste0(PCT,"%")), 
              position = position_fill(vjust = 0.5))
  return(dt_plot)
}

fn.colplot(dt, 'col2', 'group')
库(data.table)
图书馆(GG2)

fn.colplot如果您能够以可复制的格式提供一些toy_数据,这些数据可以复制并尝试使用代码,那么您获得帮助的机会将显著增加。建议的副本:。不要注意带有
aes\u字符串的最上面的答案,因为它已经过时了,请使用
.data
其他答案中提到的方法。谢谢!我尝试了你的代码,但问题仍然存在。我认为我在代码中的问题是
dt_PCT部分,我没有意识到
by
仅在有一列时才对字符串值起作用。对于多个列,我们需要使用
mget
。查看我的更新答案。我遇到了
错误:未找到'1'的值调用自:(函数(x)stop(gettexf(“未找到%s的值”,sQuote(x)),call.=FALSE))(“1”)
是否需要为
ifnotfound
指定值?按字符处理由单个字符向量指定的多个列,而不是
()
如果您将这些变量与
c()
@1darknight组合在一起,请提供一个可复制的示例,以进一步帮助您。
library(data.table)
library(ggplot2)

fn.colplot <- function(data, col2, GROUP) {
  dt_PCT <- dt[, .N, c(col2, GROUP)]
  dt_PCT[, PCT := round(100*N/sum(N)), by = .(GROUP)]

  dt_plot <- ggplot(dt_PCT, aes(.data[[GROUP]], PCT, 
                   fill = factor(.data[[col2]]))) +
    geom_col(position = "fill") + 
    geom_text(aes(label = paste0(PCT,"%")), 
              position = position_fill(vjust = 0.5))
  return(dt_plot)
}

fn.colplot(dt, 'col2', 'group')