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