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
我正在尝试 "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