我正在做一个小组项目。对于我的分析,我需要一些软件包。因此,为了让我的脚本在每个人的计算机上都能工作,我在开始时告诉R在所有已安装的软件包中检查所需软件包的名称,如果名称不存在,请安装它。我的代码是:
{
ifelse("ggplot2" %in% rownames(installed.packages()),"" ,install.packages("ggplot2"))
ifelse("agricolae" %in% rownames(installed.packages()),"" ,install.packages("agricolae"))
ifelse("lattice" %in% rownames(installed.packages()),"" ,install.packages("lattice"))
ifelse("DescTools" %in% rownames(installed.packages()),"" ,install.packages("DescTools"))
ifelse("FSA" %in% rownames(installed.packages()),"" ,install.packages("FSA")) }
但是它似乎不能很好地工作。就像,R安装第一个,但不安装第二个。 仅仅是因为ggplot太大而R忘记了其余部分还是我还有另一个错误?
谢谢大家!
答案 0 :(得分:3)
它认为您感到困惑的原因是您将所有这些命令都放在了大括号的代码块中,该代码块只会返回1个东西。如果您只卸下了牙套,可能会更清楚一些。观察:
{
ifelse(TRUE, "yes", "no")
ifelse(TRUE, "yes", "no")
}
Returns: "yes"
只有一个。更好的是,尝试以下方法:
packages=c("ggplot2", "lattice", "simpleCache")
installed = rownames(installed.packages())
for (pkg in packages) {
if (! pkg %in% installed) {
install.packages(pkg)
}
}
答案 1 :(得分:1)
问题是您使用了ifelse
。在ifelse
的帮助下:
“ ifelse”返回的值与“ test”具有相同的形状,即 填充从“是”或“否”中选择的元素 关于“测试”元素是“真”还是“假”。
现在install.packages
不可见地返回NULL
,这与ifelse
不兼容,如您所见:
ifelse(T, NULL, 1)
# Error in ans[test & ok] <- rep(yes, length.out = length(ans))[test & ok] :
# replacement has length zero
# In addition: Warning message:
# In rep(yes, length.out = length(ans)) :
# 'x' is NULL so the result will be NULL
ifelse
用于矢量,例如:
ifelse(c(TRUE, FALSE, TRUE), 1, 2))
# [1] 1 2 1
,因此不能很好地应付NULL
返回的install.packages
值。
您想要的一对一代码替换是:
if ("ggplot2" %in% rownames(installed.packages())) install.packages("ggplot2")
但是最好使用您在此处找到的基于list
的答案之一,因为它易于维护。