dplyr 尝试进行条件类型转换时出现“promise already under evaluation”错误

问题描述 投票:0回答:0

我正在尝试使用

dplyr::mutate
获取一个字符变量并从中创建一个数字变量。我使用的方法给我一个错误,我不确定为什么。

示例:具有两个字符变量的数据框。一个总是有可以转换为整数的字符串,有时有一个字母“E”。我想将两列都转换为数字,用零替换字母“E”。

df <- data.frame(
    always_numstring=c("4", "1", "3"), 
    usually_numstring=c("4", "1", "E"))

以下行按预期工作:

df %>% mutate(x=ifelse(always_numstring=="E", 0, as.numeric(always_numstring)))

  always_numstring usually_numstring x
1                4                 4 4
2                1                 1 1
3                3                 E 3

下面一行没有:

df %>% mutate(x=ifelse(usually_numstring=="E", 0, as.numeric(usually_numstring)))

Error in base::nchar(wide_chars$test, type = "width") : 
  promise already under evaluation: recursive default argument reference or earlier problems?

我什至没想到它会尝试将“E”转换为数字。更重要的是,我不明白为什么这是致命的,而

as.numeric("E")
通常不是。

这是一个非 dplyr 版本,它发出警告但随后按预期工作:

df$x <- ifelse(df$usually_numstring=="E", 0, as.numeric(df$usually_numstring))
Warning message:
In ifelse(df$usually_numstring == "E", 0, as.numeric(df$usually_numstring)) :
  NAs introduced by coercion

df
  always_numstring usually_numstring x
1                4                 4 4
2                1                 1 1
3                3                 E 0

问题:

  1. 使用 dplyr 做我想做的事情的合适方法是什么:检查字符串是否存在非法值,并仅在适当时转换为数字?

奖金问题:

  1. 当它试图将“E”转换为数字时,它显然快要死了。为什么那是致命的?

  2. 为什么这个特定的错误消息?

  3. 你能指出为什么 ifelse() 正在评估

    yes
    no
    表达式的解释吗?我的默认设置是期望它在这里表现得像
    if()

r
© www.soinside.com 2019 - 2024. All rights reserved.