基于输入文件在R中创建包含这些对象信息的新对象

基于输入文件在R中创建包含这些对象信息的新对象,r,assign,R,Assign,假设我有以下查找表: object_lookup <- data.frame(name = c(new_var_1, new_var_2, new_var_2), value = c(7, "ABC", "XYZ"), type = c("numeric", "character", "

假设我有以下查找表:

object_lookup <- data.frame(name  = c(new_var_1, new_var_2, new_var_2),
                            value = c(7, "ABC", "XYZ"),
                            type  = c("numeric", "character", "character"))

有什么想法吗?

您在
数据中的第一列。帧应为字符向量,然后您可以尝试以下方法:

library(dplyr)
library(purrr)

object_lookup %>%
  mutate(across(everything(), as.character)) %>%
  group_by(name) %>%
  summarise(value = list(value), type = unique(type)) %>%
  {if(any(count(., name)$n > 1)) stop("wrong input") else .} %>%
  mutate(value = map2(value, type, ~do.call(paste0("as.", .y), args = list(.x)))) %>%
  select(name, value) %>%
  pwalk(~assign(.x, .y, envir = globalenv()))

停止
如果输入错误(同一变量具有不同类型)

我可以推荐一种稍微详细一点的方法。代码中的空气和清晰度没有问题。很清楚该程序打算做什么,它只需简单的步骤就可以完成,并且可以根据未来的新规范轻松灵活地进行更改

希望您也可以使用tibble而不是data.frame。这样做的好处是不会强制将值设置为字符,可能会产生不必要的副作用。(字符和数字都可以,我不知道这里面还有什么!)



对象查找的工作方式类似于charme。我甚至可以通过直接在输入文件中输入“as.numeric”或“as.character”来简化一点。将有助于不必做map2部分。
library(dplyr)
library(purrr)

object_lookup %>%
  mutate(across(everything(), as.character)) %>%
  group_by(name) %>%
  summarise(value = list(value), type = unique(type)) %>%
  {if(any(count(., name)$n > 1)) stop("wrong input") else .} %>%
  mutate(value = map2(value, type, ~do.call(paste0("as.", .y), args = list(.x)))) %>%
  select(name, value) %>%
  pwalk(~assign(.x, .y, envir = globalenv()))