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