【问题标题】:Same code in different environments render different results in R不同环境中的相同代码在 R 中呈现不同的结果
【发布时间】:2021-10-10 00:34:07
【问题描述】:

以下代码对查询呈现特定响应:

library(quantmod)

# Load ticker data from 2020-01-01 till 2021-02-02
t <- c("NKLA", "MPNGF", "RMO", "JD", "MSFT")
getSymbols.yahoo(t, auto.assign = TRUE, env = globalenv(), 
                 from = "2020-01-01", to = "2021-02-02")

# Close all Internet connections as a precaution
closeAllConnections()

# Find xts objects
x <- names(which(unlist(eapply(.GlobalEnv, is.xts))))

# Convert xts to data.frame
for (i in seq_along(x)) {
  assign(x[i], fortify.zoo(get(x[i])))
}

# The query
sapply(mget(x), names)

# The rendering
     NKLA            MPNGF            MSFT            JD            RMO           
[1,] "Index"         "Index"          "Index"         "Index"       "Index"       
[2,] "NKLA.Open"     "MPNGF.Open"     "MSFT.Open"     "JD.Open"     "RMO.Open"    
[3,] "NKLA.High"     "MPNGF.High"     "MSFT.High"     "JD.High"     "RMO.High"    
[4,] "NKLA.Low"      "MPNGF.Low"      "MSFT.Low"      "JD.Low"      "RMO.Low"     
[5,] "NKLA.Close"    "MPNGF.Close"    "MSFT.Close"    "JD.Close"    "RMO.Close"   
[6,] "NKLA.Volume"   "MPNGF.Volume"   "MSFT.Volume"   "JD.Volume"   "RMO.Volume"  
[7,] "NKLA.Adjusted" "MPNGF.Adjusted" "MSFT.Adjusted" "JD.Adjusted" "RMO.Adjusted"

调整相同的代码以适应特定环境:

library(quantmod)

symbolUpdates.env <- new.env()

# Load ticker data from 2020-01-01 till 2021-02-02 to symbolUpdates.env
t2 <- c("NKLA", "MPNGF", "RMO", "JD", "MSFT")
getSymbols.yahoo(t2, auto.assign = TRUE, env = symbolUpdates.env, 
                 from = "2020-01-01", to = "2021-02-02")

# Close all Internet connections as a precaution
closeAllConnections()

# Find xts objects in symbolUpdates.env
x2 <- names(which(unlist(eapply(symbolUpdates.env, is.xts))))

# Convert xts to data.frame that are in symbolUpdates.env
for (i2 in seq_along(x2)) {
  assign(envir = symbolUpdates.env, x2[i], fortify.zoo(get(x2[i2])))
}

# The query in symbolUpdates.env
sapply(mget(x2, envir = symbolUpdates.env), names)

# The rendering from symbolUpdates.env
     RMO            NKLA            JD            MSFT            MPNGF           
[1,] "Index"        "Index"         "Index"       "Index"         "Index"         
[2,] "Index"        "Index"         "Index"       "Index"         "Index"         
[3,] "RMO.Open"     "NKLA.Open"     "JD.Open"     "MSFT.Open"     "MPNGF.Open"    
[4,] "RMO.High"     "NKLA.High"     "JD.High"     "MSFT.High"     "MPNGF.High"    
[5,] "RMO.Low"      "NKLA.Low"      "JD.Low"      "MSFT.Low"      "MPNGF.Low"     
[6,] "RMO.Close"    "NKLA.Close"    "JD.Close"    "MSFT.Close"    "MPNGF.Close"   
[7,] "RMO.Volume"   "NKLA.Volume"   "JD.Volume"   "MSFT.Volume"   "MPNGF.Volume"  
[8,] "RMO.Adjusted" "NKLA.Adjusted" "JD.Adjusted" "MSFT.Adjusted" "MPNGF.Adjusted"

我的问题:

  • 代码中是否有错误导致symbolUpdates.env 中出现了额外的Index 列?
  • 如果是,它们是什么?
  • 什么可以纠正这个问题?
  • 另外,symbolUpdates.env 中不遵守代码的顺序,为什么?

提前致谢。


使用的系统:

  • R 版本:4.1.1 (2021-08-10)
  • RStudio 版本:1.4.1717
  • 操作系统:macOS Catalina 版本 10.15.7 和 macOS Big Sur 版本 11.6

【问题讨论】:

  • 只使用(命名的)列表而不是assign 和环境不是更容易和更干净吗?
  • 第二个版本中的一个错误是在get() 调用中:get(x2[i])) 默认为全局环境,而不是symbolUpdates.env
  • @user2554330,感谢您的评论。我纠正了帖子中的错误。我也在R 中做过,但问题仍然存在:我还有 2 个Index 列。
  • @dario。这是可能的,但是我不知道该怎么做。你介意展示一下吗?
  • 这就是我们为 R 中的命名列表分配值的方式:new_list &lt;- list(); new_list[["new_element"]] &lt;- "new_element_value"

标签: r


【解决方案1】:

可以使用match 安排订单,对我来说,我没有得到任何额外的Index 列。

lapply(mget(x2, envir = symbolUpdates.env), names)
data <- mget(x2[match(t2, x2)], envir = symbolUpdates.env)
sapply(data, names)

#      NKLA            MPNGF            RMO            JD            MSFT           
#[1,] "NKLA.Open"     "MPNGF.Open"     "RMO.Open"     "JD.Open"     "MSFT.Open"    
#[2,] "NKLA.High"     "MPNGF.High"     "RMO.High"     "JD.High"     "MSFT.High"    
#[3,] "NKLA.Low"      "MPNGF.Low"      "RMO.Low"      "JD.Low"      "MSFT.Low"     
#[4,] "NKLA.Close"    "MPNGF.Close"    "RMO.Close"    "JD.Close"    "MSFT.Close"   
#[5,] "NKLA.Volume"   "MPNGF.Volume"   "RMO.Volume"   "JD.Volume"   "MSFT.Volume"  
#[6,] "NKLA.Adjusted" "MPNGF.Adjusted" "RMO.Adjusted" "JD.Adjusted" "MSFT.Adjusted"

【讨论】:

  • 我认为需要(不确定这是否正确/必要)是symbolUpdates.env的内容顺序与.GlobalEnv的内容顺序匹配(即symbolUpdates.env内容顺序 = RMO NKLA JD MSFT MPNGF ,而 .GlobalEnv 内容顺序 = MSFT MPNGF NKLA JD RMO)。
  • 尽管如此,identical(names(x), names(x2)) 渲染TRUE,所以我猜data.frame 对象以不同的environments 顺序将一个附加到另一个应该不是问题。我对吗?但是,identical(x, x2) 呈现 FALSE...
【解决方案2】:

@user2554330 指出编码错误并且缺少一块。更正第一个并添加第二个就可以了。

最后一个for 循环的原始代码如下所示:

for (i2 in seq_along(x2)) {
  assign(envir = symbolUpdates.env, x2[i], fortify.zoo(get(x2[i])))
}

它应该是这样的(i2 而不是 i 并在末尾添加 envir = symbolUpdates.env

for (i2 in seq_along(x2)) {
  assign(envir = symbolUpdates.env, x2[i2], fortify.zoo(get(x2[i2], 
                                           envir = symbolUpdates.env)))
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 2019-05-06
    • 2017-10-06
    • 1970-01-01
    相关资源
    最近更新 更多