【问题标题】:Call an argument name within a function in R在 R 中的函数中调用参数名称
【发布时间】:2015-09-04 10:12:49
【问题描述】:

我想创建一个通用函数naTrans,将'NA''' 替换为NA

问题是我无法用函数内创建的修改后的test 数据框(mydf)替换全局环境中的数据框test。这是我最好的尝试。

# Example dataframe containing 'NA'
test <- as.data.frame(matrix(sample(c('NA', 1:9), 10*10, TRUE), 10))

# My function
naTrans <- function (mydf) {
  mydf[mydf == 'NA' | mydf ==''] <- NA
  assign(deparse(substitute(mydf))[1], mydf, envir = globalenv())
}

test <- naTrans(test)

any(is.na(test))
# [1] FALSE

问题肯定出在最后一行代码assign(print(deparse(substitute(mydf))), mydf, envir = globalenv())

有什么想法吗?

【问题讨论】:

  • @Tensibai 删除打印对我不起作用。
  • 删除打印(并从 deparse 访问第一个元素)以提供正确的参数来分配:assign(deparse(substitute(mydf))[1], mydf, envir = globalenv())
  • 我试过了,但原来的 dat 框架没有被替换,而是创建了一个名为 "structure(list(V1 = structure(c(1L, 4L, 4L, 1L, 5L, 6L, 6L, 5L, " 的对象。
  • 只是一个问题,为什么不使用正常的方式? (即删除函数中的分配,只需test &lt;- naTrans(test)
  • 我试过了,但奇怪的是它一直在创建这个长名称的对象,而不是替换 test

标签: r function arguments call


【解决方案1】:

希望代码中的cmets够清楚

test <- as.data.frame(matrix(sample(c('NA',1:9),10*10,T),10))

naTrans <- function (mydf) {
      mydf[mydf == 'NA' | mydf == ''] <- NA # use and or opertor, %in% don't work on DF but on vectors
      return(mydf) # return the modified mydf (the return is optionnal, you may just use mydf here 
}

test <- naTrans(test) # replace actual object by caller.

【讨论】:

  • 当然,我怎么没想到呢? :)
最近更新 更多