【问题标题】:Create new objects in R based on input file with information on these objects根据输入文件在 R 中创建新对象,其中包含有关这些对象的信息
【发布时间】:2026-02-03 03:15:02
【问题描述】:

假设我有以下查找表:

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"))

我现在想浏览该列表并根据name 值创建对象,根据value 列为它们分配值,并希望确保它们具有type 中提供的类型。

我知道如何使用 assign 一次创建一个新对象,但我正在努力解决 a) 自动化流程和 b) 确保类型正确和 c) 如何处理以下情况应该分配多个值。我在这里想到了某种应用功能?

某事。喜欢apply(object_lookup, 1, function(x) {assign(name, value); if (type == "numeric) as.numeric(x)}

最终,我想在该示例中添加两个新的 R 对象:

new_var_1 <- c(7) # numeric
new_var_2 <- c("ABC", "XYZ") # character

有什么想法吗?

【问题讨论】:

    标签: r assign


    【解决方案1】:

    data.frame 中的第一列应该是字符向量,然后你可以尝试这样的操作:

    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()))
    

    stop 是否输入错误(相同变量不同类型)

    【讨论】:

    • 像魅力一样工作。我什至可以通过将“as.numeric”或“as.character”直接放入输入文件中来简化一点。将有助于不必做 map2 部分。
    【解决方案2】:

    我可以推荐一个稍微冗长的方法。您的代码中的空气和清晰度没有任何问题。程序的意图很明确,它通过简单的步骤完成,并且可以轻松灵活地更改以适应未来的新规范。

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

    
    object_lookup <- tibble(
        name  = c("new_var_1", "new_var_2", "new_var_2"),
        value = list(7, "ABC", "XYZ"),
        type  = c("numeric", "character", "character")
    )
    
    
    known.types <- list(
        numeric = as.numeric,
        character = as.character
    )
    
    for( vname in unique( object_lookup$name ) ) {
    
        i <- object_lookup$name %in% vname
        vtype <- unique( object_lookup$type[i] )
    
        if( length( vtype ) > 1 ) {
            stop( "A variable can only have one type: '", vname, "' failed to process.")
        }
    
        assign(
            vname,
            known.types[[vtype]]( unlist( object_lookup$value[i], recursive=FALSE ) )
        )
    
    }
    
    

    当信任并从可变输入创建内容时,建议使用一些故障保护机制。例如,上面的代码将永远不会运行,除非该类型存在于声明类型列表中,这还提供了一个转换器,这是一个很好的安全措施。如果您不需要转换器,您也可以将I 放在那里,例如 known.types 中的weirdobject = I

    【讨论】:

      最近更新 更多