我试图"动态地"改变不同数据帧的特定列值。为此,我使用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)
}
这段代码将输入的数字/字符串分配给显示的整个列。但问题是,当点击中止(在弹出对话框)它分配NA
列。好吧,我需要的是,当点击中止列保持它是怎样的。我怎么能把那样的东西存档呢?我尝试了一些不同的else
声明,但我没有成功。有人有什么想法吗?提前感谢!
编辑:如果我的列是这样的
A B C
5 6 10
2 3 8
car bus car
7 77 8
然后弹出问题:为"A"输入新的列值并按ok。单击"中止"不更改任何内容。=>点击
流产
为"B"输入新的列值并按ok。单击"中止"不更改任何内容。=>我写Test,然后点击
O。K
为"C"输入新的列值并按ok。单击"中止"不更改任何内容。=>点击
流产
结果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