R 将用户输入(字符或字符串)读入switch语句或嵌套ifelse(其中包含函数)中的ggplot命令
我有这样的代码R 将用户输入(字符或字符串)读入switch语句或嵌套ifelse(其中包含函数)中的ggplot命令,r,ggplot2,R,Ggplot2,我有这样的代码 AA <- as.integer(readline("Select any number")) switch(AA, 1={ num <-as.integer(readline("Select any one of the options \n")) print('You have selected option 1') #reading user data var <- readline("enter the
AA <- as.integer(readline("Select any number"))
switch(AA,
1={
num <-as.integer(readline("Select any one of the options \n"))
print('You have selected option 1')
#reading user data
var <- readline("enter the variable name \n")
#aggregating the data based on required condition
gg1 <- aggregate(cbind(get(var))~Mi+hours,a, FUN=mean)
#Ploting
ggplot(gg1, aes(x = hours, y = get(var), group = Mi, fill = Mi, color = Mi)) + geom_point() + geom_smooth(stat="smooth", alpha = I(0.01))
},
2={
print('bar')
},
{
print('default')
}
)
gg1得到的数据很好。
我不知道如何使用户输入的变量在ggplot命令中工作。
请对此提出任何解决方案
dput输出
structure(list(Ei = c(1L, 1L, 1L, 1L, 1L, 1L), Mi = c(1L, 1L,
1L, 1L, 1L, 1L), hours = 1:6, Nphy = c(0.1023488, 0.104524, 0.1064772,
0.1081702, 0.1095905, 0.110759), Cphy = c(0.6534707, 0.6448216,
0.6369597, 0.6299084, 0.6239005, 0.6191941), CHLphy = c(0.1053458,
0.110325, 0.1148174, 0.1187672, 0.122146, 0.1249877), Nhet = c(0.04994161,
0.04988347, 0.04982555, 0.04976784, 0.04971029, 0.04965285),
Chet = c(0.3308593, 0.3304699, 0.3300819, 0.3296952, 0.3293089,
0.3289243), Ndet = c(0.04991916, 0.04984045, 0.04976363,
0.0496884, 0.04961446, 0.04954156), Cdet = c(0.3307085, 0.3301691,
0.3296314, 0.3290949, 0.3285598, 0.3280252), DON = c(0.05042275,
0.05085697, 0.05130091, 0.05175249, 0.05220978, 0.05267118
), DOC = c(49.76304, 49.52745, 49.29323, 49.06034, 48.82878,
48.59851), DIN = c(14.9933, 14.98729, 14.98221, 14.9781,
14.97485, 14.97225), DIC = c(2050.132, 2050.264, 2050.396,
2050.524, 2050.641, 2050.758), AT = c(2150.007, 2150.007,
2150.007, 2150.007, 2150.007, 2150.007), dCCHO = c(0.964222,
0.930869, 0.8997098, 0.870544, 0.843196, 0.8175117), TEPC = c(0.1339044,
0.1652179, 0.1941872, 0.2210289, 0.2459341, 0.2690721), Ncocco = c(0.1040715,
0.1076058, 0.1104229, 0.1125141, 0.1140222, 0.1151228), Ccocco = c(0.6500288,
0.6386706, 0.6291149, 0.6213265, 0.6152447, 0.6108502), CHLcocco = c(0.1087667,
0.1164099, 0.1225822, 0.1273103, 0.1308843, 0.1336465), PICcocco = c(0.1000664,
0.1001396, 0.1007908, 0.101836, 0.1034179, 0.1055634), par = c(0,
0, 0.8695131, 1.551317, 2.777707, 4.814341), Temp = c(9.9,
9.9, 9.9, 9.9, 9.9, 9.9), Sal = c(31.31, 31.31, 31.31, 31.31,
31.31, 31.31), co2atm = c(370, 370, 370, 370, 370, 370),
u10 = c(0.01, 0.01, 0.01, 0.01, 0.01, 0.01), dicfl = c(-2.963256,
-2.971632, -2.980446, -2.989259, -2.997877, -3.005702), co2ppm = c(565.1855,
565.7373, 566.3179, 566.8983, 567.466, 567.9814), co2mol = c(0.02562326,
0.02564828, 0.0256746, 0.02570091, 0.02572665, 0.02575002
), pH = c(7.879427, 7.879042, 7.878636, 7.878231, 7.877835,
7.877475)), .Names = c("Ei", "Mi", "hours", "Nphy", "Cphy",
"CHLphy", "Nhet", "Chet", "Ndet", "Cdet", "DON", "DOC", "DIN",
"DIC", "AT", "dCCHO", "TEPC", "Ncocco", "Ccocco", "CHLcocco",
"PICcocco", "par", "Temp", "Sal", "co2atm", "u10", "dicfl", "co2ppm",
"co2mol", "pH"), row.names = c(NA, 6L), class = "data.frame")
根据下面的建议,我尝试了很多,但都不起作用
总结而言,我要说:
var这只是一个命名问题。每次运行一行代码,您可以看到
gg1
的样子:
> gg1 <- aggregate(cbind(get(var))~Mi+hours,a, FUN=mean)
> head(gg1)
Mi hours V1
1 1 1 0.1021998
2 2 1 0.1021966
3 3 1 0.1022071
4 4 1 0.1022026
5 5 1 0.1022019
6 6 1 0.1022035
与使用aes()
和get(var)
相比,我还建议在这种情况下使用aes\u string()
,即aes\u string(x=“hours”,y=var,group=“Mi”,fill=“Mi”,color=“Mi”)
编辑:
除了ggplot中的aes\u string
之外,如果要在函数中使用它,还需要在聚合公式中eval(var)
。这对我来说很好:
makePlot <- function(var = readline("Enter the variable name\n")) {
gg1 <- aggregate(cbind(get(eval(var))) ~ Mi + hours, a, FUN=mean)
names(gg1)[3] <- var
print(ggplot(gg1, aes_string(x = "hours", y = var, group = "Mi",
fill= "Mi", color = "Mi")) +
geom_point())
}
# works with an argument:
makePlot(var = "Nphy")
# works interactively:
makePlot() # enter Nphy at console when prompted
makePlot您能否让您的问题变得独立,即不只是有一个到您的数据的链接,并确保我们可以将您的代码复制并粘贴到我们的控制台中。在您加载数据后,查看您的数据在R中的外观会很有帮助。是否将其存储为data.frame?如果是,请向我们展示dput(头部(您的数据))
。在这种情况下,您还应该使用aggregate
@rawr的data
参数。我已经添加了导入数据的步骤。请check@shujaa我粘贴的dput输出…@CarlWitthoft-Nah,它是data.frame(查看dput
)。cbind
似乎要做的唯一一件事是将gg1
的第三列V1
的名称改为get(var)
(就像那样,未计算)。是的,我注意到get命令更改了变量的列名,并将默认值V1,我无法在聚合后使用原始列名。你知道如何保持列名的完整性吗?有一个建议是保持它原来的类使用as,让我检查一下。是的,重命名很好。我正在查看类更改、强制或其他方法,但这没有什么区别,所以我将使用您的建议来实现。感谢您的帮助……:)对不起,如果我单独执行这些命令,效果会很好,但是如果我执行源(“文件名”)…“无法强制对象键入'double'”,同样会出现相同的错误……此错误正在重复。@statisticalbeginner好吧,那么情况就不同了。是否确实已将新版本保存在正在查找的文件中?您的数据是加载在该文件中还是在全局环境中?您应该做的是清除您的工作区,在发生错误的位置(是绘图还是聚合?)之前的文件中放置一行stop()
,然后尝试运行下一行代码。查看所有对象,确保它们看起来正确,并查找不同之处。您可以通过将其包装到函数中并使用browser()
,来执行类似操作,但这只是标准调试。有些东西的名字和你想象的不一样,或者不在你想象的地方。试着找出问题所在。
fun1 <- function() {
print('You have selected option 1')
my <- as.character((readline("enter the variable name \n")))
gg1 <- aggregate(cbind(get(my))~Mi+hours,a, FUN=mean)
names(gg1)[3] <- my
#print(names(gg1))
ggplot (gg1,aes_string(x="hours",y=(my),group="Mi",color="Mi")) + geom_point()
}
my <- as.integer(readline("enter a number"))
ifelse(my == 1,fun1(),"")
ifelse(my == 2,print ("its 2"),"")
ifelse(my == 3,print ("its 3"),"")
ifelse(my != (1 || 2|| 3) ,print("wrong number"),"")
> gg1 <- aggregate(cbind(get(var))~Mi+hours,a, FUN=mean)
> head(gg1)
Mi hours V1
1 1 1 0.1021998
2 2 1 0.1021966
3 3 1 0.1022071
4 4 1 0.1022026
5 5 1 0.1022019
6 6 1 0.1022035
gg1 <- aggregate(cbind(get(var))~Mi+hours,a, FUN=mean)
names(gg1)[3] <- var
makePlot <- function(var = readline("Enter the variable name\n")) {
gg1 <- aggregate(cbind(get(eval(var))) ~ Mi + hours, a, FUN=mean)
names(gg1)[3] <- var
print(ggplot(gg1, aes_string(x = "hours", y = var, group = "Mi",
fill= "Mi", color = "Mi")) +
geom_point())
}
# works with an argument:
makePlot(var = "Nphy")
# works interactively:
makePlot() # enter Nphy at console when prompted