r - 将函数应用于名称为字符串的所有变量
问题描述
假设你有 3 个变量,即
VAR1 = 3
VAR2 = 4
VAR3 = 2
有没有办法将名称中带有字符串“VAR”的所有变量转换为字符?
解决方案
通常,人们会尝试将这些变量分组到一个列表中,但如果没有,我们可以这样做:
for(nm in ls(pattern = "^VAR")) .GlobalEnv[[nm]] <- as.character(.GlobalEnv[[nm]])
不是全球环境的环境
如果您在不是全局环境的环境中拥有这些,请按如下方式进行修改。函数体的第一行定义了测试数据,下一行为e
方便起见将当前环境放入一个变量中,之后的行执行转换。最后,我们检查变量已转换为什么。
f <- function() {
VAR1 <- 1; VAR2 <- 2; VAR3 <- 3 # test data
e <- environment() # current environment
for(nm in ls(pattern = "^VAR")) e[[nm]] <- as.character(e[[nm]])
str(VAR1); str(VAR2); str(VAR3) # check results
}
f()
列表
如果您可以将它们安排在列表中,那么:
L <- list(VAR1 = 1, VAR2 = 2, VAR3 = 3) # test data
L <- lapply(L, as.character)
或者如果有一些元素不需要处理:
L2 <- list(VAR1 = 1, VAR2 = 2, VAR3 = 3, other = 4) # test data
ix <- grep("^VAR", names(L2))
L2[ix] <- lapply(L2[ix], as.character)
如果您不想覆盖L
并且L2
- 覆盖往往会使调试更加困难 - 然后使用Lnew <- lapply(L, as.character)
andL2new <- replace(L2, ix, lapply(L2[ix], as.character))
代替。
推荐阅读
- python - QtQuick GeometryChanged 方法仅适用于加载组件的一个方向
- knockout.js - 使 observable 不更新输入值
- typescript - 使用数据库的环回 4 身份验证
- javascript - 我的猫鼬集合没有将传递的数据保存到数据库中
- c - C 编程中 Typedef Struct 的使用
- visual-studio-2015 - Visual Studio 2015 在监视窗口中查看数组
- typescript - 打字稿字符串驱动的打字
- r - GPS坐标的`chull`?
- python - 在原始数据部分插入序列化程序时出现错误,Django REST Framework
- azure-iot-hub - 单个 IOT 设备上的多个 MQTT 连接