2

我正在尝试编写一个基于用户输入组合数据的函数。

我四处搜索,但找不到任何似乎有帮助的东西(我对使用 R 有点陌生)。

单独运行每一行效果很好。但是,当我将它们包装到使用过的定义函数中时,什么都不会产生。例如,我有以下数据:ASW1_2016、ASW_2017、ASW_2018、CSW_2015、CSW_2017。我想提示用户输入站点名称“ASW1”,并让该功能组合包含该名称的所有数据。

#Running these two lines separately works:
Site <- invisible(readline(prompt = "Enter Site Name:"))

assign(Site, rbindlist(mget(apropos(Site), inherits = TRUE))

#Putting these two lines into a function does not produce anything:
CombineData <- function()

{

Site <- invisible(readline(prompt = "Enter Site Name:"))

assign(Site, rbindlist(mget(apropos(Site), inherits = TRUE))

}

CombineData()

在被要求输入站点名称(例如 ASW1)后,我希望将包含此名称的所有数据合并并分配用户提供的名称。但是,如上所述,当我运行 CombineData() 并按照提示输入站点名称时,没有任何反应。

4

1 回答 1

1

assign默认情况下在函数内调用会在函数的环境中进行赋值,而不是在全局环境中。所以基本上,这就像将结果存储在函数内的变量中。一旦函数返回,该值就会丢失。以下说明了这一点(这本质上就是您正在做的事情):

fxn <- function() assign("xyz", 1)
fxn()
print(xyz)
# Error in print(xyz) : object 'xyz' not found

如果您想用于assign存储在全局环境中(函数外部),您可以将参数添加envir = .GlobalEnv到对assign.

fxn <- function() assign("xyz", 1, envir = .GlobalEnv)
fxn()
print(xyz)
# [1] 1

话虽如此,使用assign存储值通常不是在 R 中存储数据的首选方式(您可以在Why is using assign bad?中阅读更多相关信息)。如果将代码存储在列表中,您可能会发现更容易维护代码。例如,如果您有一个初始列表l <- list(),那么您可以将新数据存储在该列表中,并使用orl[[Site]] <- rbindlist(mget(apropos(Site), inherits = TRUE)访问它。[[$

于 2019-09-03T14:45:08.957 回答