R:为整列分配一个新值,否则列保持原样

R: Assign a new value for whole column otherwise column stays as it is

我正在尝试 "dynamically" 更改不同 data.frames 的特定列值。为此,我使用 svDialogs 包来允许输入一些次要值。

目前我得到的代码是:

library(svDialogs)

a <- iris
b <- attitude

dfs <- c("a", "b")

for(df in dfs) {
  df.tmp <- get(df)
  for(i in 1:length(names(df.tmp))){
    df.tmp[i] <- dlgInput(sprintf('Enter new column value for "%s" and press ok. Click Abort to change nothing', names(df.tmp)[i]), Sys.info()["n"])$res
  } 
  assign(df, df.tmp)
}

那段代码将输入的 number/string 分配给显示的整个列。但问题是单击中止(在弹出对话框中)时,它会将 NA 分配给列。好吧,我需要的是,当单击中止时,该列保持原样。我怎么能存档这样的东西?我尝试了一些不同的 else 语句,但没有成功。任何人有任何想法。提前致谢!

编辑: 因此,如果我的专栏看起来像以前那样:

A    B   C
5    6   10
2    3   8
car  bus car
7    77  8

然后出现弹窗问题: 为 "A" 输入新的列值,然后按确定。单击中止不进行任何更改。 => 点击

Abort

为 "B" 输入新的列值,然后按确定。单击中止不进行任何更改。 => 我编写测试并单击

O.K

为 "C" 输入新的列值,然后按确定。单击中止不进行任何更改。 => 点击

Abort

然后结果 data.frame 如下所示:

A    Test C
5    6    10
2    3    8
car  bus  car
7    77   8

在这个例子中,我将用户输入捕获到一个变量中并检查它是否不为空。当我运行这个例子的时候,我输入了1、2、3、4,然后按了两次取消,继续输入8到14之间的整数。

library(svDialogs)

a <- iris
b <- attitude

dfs <- c("a", "b")

for(df in dfs) {
  df.tmp <- get(df)
  for(i in 1:length(names(df.tmp))){
    ui <- dlgInput(sprintf('Enter new column value for "%s" and press ok. Click Abort to change nothing', names(df.tmp)[i]), default = "", Sys.info()["n"])$res

    if (length(ui) == 0) {
      next
    } else {
      df.tmp[i] <- ui
    }
  } 
  assign(df, df.tmp)
}

这是结果。

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1            1           2            3           4  setosa
2            1           2            3           4  setosa
3            1           2            3           4  setosa
4            1           2            3           4  setosa
5            1           2            3           4  setosa
6            1           2            3           4  setosa
> head(b)
  rating complaints privileges learning raises critical advance
1     43          8          9       11     12       13      14
2     63          8          9       11     12       13      14
3     71          8          9       11     12       13      14
4     61          8          9       11     12       13      14
5     81          8          9       11     12       13      14
6     43          8          9       11     12       13      14