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

时间:2015-08-24 08:35:50

标签: r dataframe user-input

我试图“动态”更改不同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)
}

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

编辑: 所以如果我的专栏之前看起来像那样:

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

然后出现弹出问题: 输入“A”的新列值,然后按确定。单击“中止”不进行任何更改。 =&GT;单击

  

中止

输入“B”的新列值,然后按确定。单击“中止”不进行任何更改。 =&GT;我写了Test并点击

  

O.K

输入“C”的新列值,然后按确定。单击“中止”不进行任何更改。 =&GT;单击

  

中止

然后生成的data.frame如下所示:

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

1 个答案:

答案 0 :(得分:1)

在此示例中,我将用户输入捕获到变量中并检查它是否为空。当我运行该示例时,我输入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