可以更简洁地编写“ assign()”和“ get()”吗?

时间:2019-02-14 12:47:49

标签: r

下面是我的代码。我使用额外的变体“ tmp”来清理“ ABC_Chla”。因为“ Location_name”可以更改,所以我使用了“ assign()”和“ get()”函数。

Location_name <- "ABC_"
tmp <- get(paste(Location_name,"DO",sep = "")) %>% filter(log.DO != -Inf)
assign(paste(Location_name,"DO",sep = ""), tmp)

我的代码可以实现此目标,但看起来并不简洁(引入一个临时变量)。有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

假设输入在末尾的注释中可重复显示(下次请确保您的问题包括完整的可重复代码,包括输入),我们可以进行以下更改:

  • 使用paste0代替paste
  • 创建变量locname来保存数据框的名称,并创建变量e来作为数据框所在的环境
  • 使用e[[...]]代替getassign
  • 使用magrittr %<>%双向管道
  • 可能使用filter(is.finite(log.DO))-以下未显示

提供此代码:

library(dplyr)
library(magrittr)

e <- .GlobalEnv # change if our data frame is in some other environment
locname <- paste0(Location_name, "DO")

e[[locname]] %<>% 
   filter(log.DO != -Inf)

结果是:

get(locname, e)
##   log.DO
## 1      1
## 2      2

替代

此替代方法仅使用普通管道。我们从上方使用elocname

library(dplyr)

 e[[locname]] <- e[[locname]] %>% 
  filter(log.DO != -Inf)

注意

测试输入:

ABC_DO <- data.frame(log.DO = c(1, -Inf, 2))
Location_name <- "ABC_"

答案 1 :(得分:0)

您只有一个临时变量,因为您将数据存储在tmp中,我认为这不是问题。但是,在这种情况下,我看到的唯一可以做的就是直接将tmp代码传递给分配,例如:

assign(
       paste(Location_name,"DO",sep = ""),
       get(paste(Location_name,"DO",sep = "")) %>% filter(log.DO != -Inf)
      )