【问题标题】:treat string as object name in a loop in R在R中的循环中将字符串视为对象名称
【发布时间】:2015-05-08 16:08:02
【问题描述】:

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

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

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

【问题讨论】:

  • 不要使用assign() 创建许多变量。而是学习如何使用列表和函数twitter.com/hadleywickham/status/535931179556691968
  • 当你想创建顺序命名的变量时,你应该使用列表来代替:stackoverflow.com/a/24376207/903061
  • 一个来自新用户的相当常见的问题是:如何为一组相似的对象分配名称?" 是的,您可以这样做,但您可能不想更好的是:矢量化你的想法。将所有相似的对象放在一个列表中。随后的分析和操作会更加顺畅。R Inferno 第 20 页。

标签: r string loops object


【解决方案1】:

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

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

【讨论】:

  • 非常感谢大家的有用回答! call() 的解决方案效果很好。一旦我了解了真正发生的事情(我被 Stata 宠坏了并在循环中思考),我就会尝试更多的 R-ish 策略。
  • 好的,我赞成您的解决方案。我玩过它......现在我想为你的解决方案投票 1k 倍。 :)
【解决方案2】:
assign("variableName", 5)

会这样做。

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

assign(varname[1], 2 + 2)

越来越多的信息

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

【讨论】:

  • 所以如果我做对了,它会分配给变量名 1,即 4 的值(评估 2+2 而无需被告知这样做)。
【解决方案3】:

@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))

【讨论】:

  • 一种更 R-ish 的做事方式是使用列表而不是 assign
  • 是的,所有答案都符合 OP 的要求。我只是在挑选你的“更多 R-ish” 俏皮话;)
【解决方案4】:

我遇到了同样的问题,由于某种原因我的申请不起作用(lapply,直接分配,或者我首选的 goto,mclapply)

但这有效

vectorXTS <- mclapply(symbolstring,function(x)
    {
      df <- symbol_data_set[symbol_data_set$Symbol==x,]
      return(xts(as.data.frame(df[,-1:-2]),order.by=as.POSIXct(df$Date)))
    })

    names(symbolstring) <- symbolstring
    names(vectorXTS) <- symbolstring

    for(i in symbolstring) assign(symbolstring[i],vectorXTS[i])

【讨论】:

    猜你喜欢
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多