在R中的循环中将字符串视为对象名称

时间:2015-03-06 23:08:29

标签: r string loops object

我想在循环中创建一个字符串,并在此循环中将此字符串用作对象。这是一个简化的例子:

for (i in 1:2) {
  x <- paste("varname",i, sep="")
  x <- value
}

循环应该创建varname1,varname2。然后我想使用varname1,varname2作为对象来赋值。我尝试过paste(),print()等。 谢谢你的帮助!

4 个答案:

答案 0 :(得分:4)

您可以创建call()<-,然后对其进行评估。这是一个例子,

value <- 1:5

for (i in 1:2) {
    x <- paste("varname",i, sep="")
    eval(call("<-", as.name(x), value))
}

创建两个对象varname1varname2

varname1
# [1] 1 2 3 4 5
varname2
# [1] 1 2 3 4 5

但是你应该尽量避免在方法/函数中分配到全局环境。我们可以使用列表和substitute(),然后我们将新变量放在同一个地方。

f <- function(aa, bb) {
    eval(substitute(a <- b, list(a = as.name(aa), b = bb)))
}

Map(f, paste0("varname", 1:2), list(1:3, 3:6))
# $varname1
# [1] 1 2 3
#
# $varname2
# [1] 3 4 5 6

答案 1 :(得分:1)

@MahmutAliÖZKURAN已回答了有关如何使用循环执行此操作的问题。实现这一目标的更多“R-ish”方法可能是:

mapply(assign, <vector of variable names>, <vector of values>,
       MoreArgs = list(envir = .GlobalEnv))

或者,如上所述:

mapply(assign, paste0("varname", 1:2), <vector of values>,
       MoreArgs = list(envir = .GlobalEnv))

答案 2 :(得分:0)

assign("variableName", 5)

会这样做。

例如,如果您在字符串数组中有变量名,则可以将它们设置为循环:

assign(varname[1], 2 + 2)

越来越多的信息

https://stat.ethz.ch/R-manual/R-patched/library/base/html/assign.html

答案 3 :(得分:0)

我遇到了同样的问题,由于某种原因,我的申请无法正常工作(申请,直接分配,或者我的首选goto,mclapply)

但这可行

  const config = require('../config/database');

    const User = require('./users');

   const mongoose = require('mongoose');

const CompanySchema = mongoose.Schema({

   name: { type: String, required: true },
   email: { type: String, required: true },
   city: { type: String, required: true },
   phoneNumber: { type: String, required: true },
   creator :[{
      type: mongoose.Schema.Types.ObjectId,
      ref: 'User'
  }]

}, { collection: 'companies' });
module.exports = mongoose.model('Company', CompanySchema);