在 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)deparse
和substitute
对表达式而不是字符串进行操作。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