【问题标题】:How to write a result of function in the global environment in R如何在R中的全局环境中编写函数的结果
【发布时间】:2017-11-05 15:51:23
【问题描述】:

我有这些数据集:A <- 4, B <- 3, C <- 2

所以我把它们放在一个列表中 D<-list(A,B,C) 并想应用此功能:

s<-function(x) {
    t<-8
    x<-as.data.frame(x*t)
}

lapply(D,s)

当我应用 lapply 函数时,它只会打印它们。

我怎样才能让它在全局环境中保存结果而不是打印它们?

所以结果应该是 A 的值为 32 B 的值为 24 C 的值为 16。

【问题讨论】:

  • 听起来你想要scoping assignment arrow
  • 我在这一点上尝试了x&lt;&lt;-as.data.frame(x*t) 的问题,它使用名称x 而不是A, B , C 写入值
  • 您可以将lapply 的结果存储在现有变量D 中(“覆盖它”)。单个变量 A、B 和 C 不会因此而改变,但是使用没有像列表这样的“容器”的单个变量使得应用灵活的算法变得非常困难......然后您可以通过 D$A、@987654336 访问变量@ 和 "D$C 这只是一个命名空间(将其视为“完全限定的变量名”)。

标签: r save global lapply


【解决方案1】:

最好将所有变量“偏离”全局环境中的list 中(保持环境清洁/更小并允许各种循环):

D <- list(A = 4, B = 3, C = 2)

s <- function(x) {
  t <- 8
  x * t   # return just the value
}

result <- lapply(D, s)
names(result) <- names(D)  # rename the results
D <- result  # replace the original values with the "updated" ones

D
D$A  # to access one element

【讨论】:

  • 我正在尝试更改全局环境中的值。因此名为A 的数据集应更改为A*t。所以应用该功能后,我不应该看到旧的A &lt;- 4,它必须是新的A&lt;-32,它应该与BC分开......也许我误解了lapply的使用。
  • 好的,现在我明白你的问题的目的了。 R 总是“按值”传递函数参数,因此您只能在本地(在函数内)更改它们,但调用者的变量不会改变。此行为独立于lapply。我现在继续在您的问题上使用 cmets ...
【解决方案2】:

代替lapply(D,s),使用:

D <- lapply(D, s)
names(D) <- c("A", "B", "C")
list2env(D, envir = .GlobalEnv)

【讨论】:

  • 干得好,+1(我不知道list2env 会在没有警告的情况下替换现有变量)
猜你喜欢
  • 2016-03-27
  • 2020-07-29
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 2018-01-22
  • 1970-01-01
  • 2018-02-16
相关资源
最近更新 更多