assign(x)、eval(parse(text = "x" ))、get(x) 和 deparse(substitute(x)) 之间有什么区别?



在 R 中,以下表达式集在功能上是否彼此相似?

  • assign(x,y)eval(parse(text = "x"))x=as.name("string")
  • get(x)deparse(substitute(x))____(x=as.string(object))?
  • do.call("<-",list(x, y))

例如,它们中的每一个都可以在以下批处理中使用吗?

## example data tables (requires data.table package I believe) 
(dt1 <- data.table(urlteststatus = letters[1:24], urltest = letters[1:24], istest = letters[23:24] ) )
(dt2 <- data.table(istest = letters[2:2], urlteststatus = letters[1:10], urltest = paste0(letters[3:3], letters[1:10]) ) )
# list of variables to iterate over
tlist <- list("dt1","dt2")
# Batch process: This creates a new variable "x.2" which concatenates the the variables "urltest", "istest", and "urlteststatus". 
for (x in tlist) {
assign(paste0(x,".2"), mutate(assign(x, get(x)),
r_teststatus = paste(urltest,
istest,
urlteststatus)))
}

这些示例来自:将字符串转换为变量名称、将数据框添加为列表元素(使用 for 循环)以及 如何将字符串转换为数据帧名称熊猫/python。

PS:在回复中,我经常看到这样的评论:"这不是一个好方法,更像R的方式是......"但他们通常没有链接到更像R的方式。请解释或链接到什么是"正确"的方式,以及为什么。

1)assign用于动态赋值名称作为字符串传递的变量,get用于动态检索名称作为字符串传递的变量。

assign("x", 3)
x
## [1] 3
get("x")
## [1] 3

因此,如果你有一个表示变量的字符串的字符向量,我们可以迭代它们并生成包含如下维度的派生变量:

nms <- c("mtcars", "iris")
for(nm in nms) assign(paste0(nm, ".dims"), dim(get(nm)))
mtcars.dims
## [1] 32 11
iris.dims
##[1] 150 5

尽管通常我们会创建一个列表(或者在这种情况下可能创建一个矩阵),而不是让它们松散。

Map(function(nm) dim(get(nm)), nms)
## $mtcars
## [1] 32 11
## 
## $iris
## [1] 150   5

或以下给出相同结果的结果

Map(dim, mget(nms, inherits = TRUE))

2)deparsesubstitute对表达式而不是字符串进行操作。deparse将表达式转换为字符串。substitute将值替换为表达式。

deparse(quote(1+2))
## [1] "1 + 2"
substitute(y * y, list(y = 3))
3 * 3 

3)do.call执行一个函数,该函数的名称作为字符串传递(或作为函数对象传递),其参数在列表中传递。

do.call("sqrt", list(4))
## [1] 2

相关内容

  • 没有找到相关文章

最新更新