【问题标题】:converting a character element to an object in R将字符元素转换为R中的对象
【发布时间】:2020-08-25 07:36:06
【问题描述】:

我想知道是否可以将租船者元素(例如 "high")转换为具有相同名称的对象(即 high)?

这就是我在 R 代码中的意思(我想要的结果):

(注意:把下面的函数想象成what可以是任何东西,d可以是任何东西)

what <- "high"
   d <- 1:4
high <- d # Here use `what` and turn "high" to high and assign object `d` to high

【问题讨论】:

  • 这是可能的,但几乎总是一个错误。你这样做的用例是什么?可能有更好的方法。
  • 你是这个意思吗? what &lt;- "high" ; d &lt;- 1:4 ; assign(what, d) ; high
  • @Reza 我不明白:您的代码按原样运行没有更改变量名dum。无论如何,我建议反对 Darren 提出的 hacky 解决方案。除了对您的情况没有帮助之外,它还有一些不受欢迎的属性(它破坏了引用透明度)。

标签: r string function


【解决方案1】:

您通常不想这样做,因为它破坏了referential transparency 并增加了不必要的复杂性:特别是,它使您无法预测在代码执行期间存在哪些变量,这使得代码更难阅读、维护和调试。

无论如何,在您的情况下,分配给具有非固定名称的变量实际上并不能帮助构建模型矩阵。幸运的是,在您的情况下也没有必要。您现有的代码按原样工作。但如果您想更改输出列名,请在列名级别进行,而不是在变量名级别

foo <- function(data, what) {
    dum <- data[[what]]
    if (! is.character(dum)) stop('Not a character variable.', call. = FALSE)
    model <- data.frame(model.matrix(~ dum))[-1L]
    colnames(model) <- sub('^dum', what, colnames(model))
    model
}

或者,在这种情况下更容易,从what构造公式:

foo <- function(data, what) {
    if (! is.character(data[[what]])) stop('Not a character variable.', call. = FALSE)
    formula = as.formula(paste('~', what))
    data.frame(model.matrix(formula, data = data))[-1L]
}

【讨论】:

    【解决方案2】:

    assign 函数可能是您正在寻找的解决方案。

    what <- "high"
       d <- 1:4
    high <- d
    
    assign(what,d)
    
    assign("high",d)
    
    

    这样就可以玩转角色和物体了

    我尝试过的其他东西正在使用

    as.name
    

    函数,它将删除引号。但是会导致赋值错误。

    【讨论】:

    • as.name 在这里并没有真正的用处,为什么要提它呢?
    • 这是新手会尝试的第一个逻辑。只是为了表明“不要尝试”
    猜你喜欢
    • 1970-01-01
    • 2017-09-14
    • 2021-11-10
    • 1970-01-01
    • 2016-09-17
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    相关资源
    最近更新 更多