R 使用在函数中调用的数据帧列的输入编写函数

R 使用在函数中调用的数据帧列的输入编写函数,r,function,rstudio,lm,R,Function,Rstudio,Lm,我正在尝试编写一个函数,它有一列数据帧作为输入参数,这些数据帧在函数中被迭代调用 示例如下所示: 编写一个名为iter的函数,该函数有两个输入: 1) 数据帧列表 2) df1和df2都包含的列的名称 iter <- function (dflist, columnname) { for (df in dflist){ df[,bla:=cut(columnname, etc)] lm(...data=df) etc } } 但是我得到了同样的

我正在尝试编写一个函数,它有一列数据帧作为输入参数,这些数据帧在函数中被迭代调用

示例如下所示: 编写一个名为iter的函数,该函数有两个输入: 1) 数据帧列表 2) df1和df2都包含的列的名称

iter <- function (dflist, columnname) {
  for (df in dflist){
      df[,bla:=cut(columnname, etc)]
      lm(...data=df)
      etc
  }
}

但是我得到了同样的错误

你真的需要没有引号的列吗?我发现将
columname
参数作为单个
character
string对象动态更改列要容易得多。您可以使用
as.symbol()
–或
as.name()
–创建一个对象(
sym
,在函数中),该对象将在以后让您将所述对象称为R对象,而不是其值,无论分配给
columname

然后,您可以在常规的
data.table
语法中使用
eval()

library(data.table)

dList <- list(
  mtcars,
  mtcars
)

dList <- lapply(dList, function(x) copy(as.data.table(x)))

iter <- function (dflist, columnname) {
  new_var <- paste0(columnname, "_sq") 
  sym <- as.symbol(columnname)
  for (df in dflist){
    df[,(new_var):= eval(sym)^2]
  }
}

iter(dList, "mpg")
请记住,
iter
将改变
dList
中的对象,即使您没有在函数中指定
return
。赋值运算符
:=
通过引用赋值。请对此进行更彻底的解释。如果要更改函数“但在外部”中的对象并返回包含结果对象的列表,则需要首先使用
data.table::copy

iter <- function (dflist, columnname) {
  new_var <- paste0(columnname, "_sq")
  res <- vector("list", length(dflist))
  sym <- as.symbol(columnname)
  for (i in seq_along(res)){
    dt <- copy(dflist[[i]])
    res[[i]] <- dt[,(new_var):= eval(sym)^2]
  }
  return(res)
}

iter感谢您的详细回答,是的,因为我要找的是.symbol。
> head(dList[[2]], 1)
   mpg cyl disp  hp drat   wt  qsec vs am gear carb mpg_sq
1:  21   6  160 110  3.9 2.62 16.46  0  1    4    4    441
iter <- function (dflist, columnname) {
  new_var <- paste0(columnname, "_sq")
  res <- vector("list", length(dflist))
  sym <- as.symbol(columnname)
  for (i in seq_along(res)){
    dt <- copy(dflist[[i]])
    res[[i]] <- dt[,(new_var):= eval(sym)^2]
  }
  return(res)
}